Bases de données XML
Cette rubrique avancée montre comment créer deux types de bases de données XML très simples.
Lecture XML est simple. Toutefois, il est impossible d'enregistrer le code XML directement à partir de HTML ou Hippani Animator en raison de restrictions de sécurité. Une page du serveur est nécessaire pour interagir avec le serveur web. Nous avons utilisé des pages ASPX serveur écrits en c#. Autres pages de serveur et les langues pourraient servir à la place. ASPX et c# sont au-delà de la portée de cette documentation. Pour personnaliser et étendre sur ces exemples, les lectures complémentaires peuvent être nécessaires.
Vous aurez besoin d'un serveur web de Microsoft Windows (IIS) pour héberger les fichiers ASPX. Vous devrez également définir des autorisations de serveur web pour créer et écrire des fichiers.
Bases de données unique Record
Cette simple base de données stocke une liste de valeurs. Chaque valeur a un nom.
Par exemple :
HighScore=10000
PlayerName=Zara
Location=France
Créer un fichier ASPX sur votre serveur web appelé XMLDatabase.aspx. Utilisez le code suivant. Un fichier ASPX est simplement un fichier texte avec l'extension .aspx.
<%@ Page Language="C#" %>
<%@ Import namespace="System.IO" %>
<%@ Import namespace="System.Xml" %>
<%@ Import namespace="System.Collections.Generic" %>
<%
string DataFilename=Server.MapPath("Data.xml");
Dictionary<string,string> MyData=new Dictionary<string,string>();
bool DataChanged=false;
// Load the xml data into a dictionary
if(File.Exists(DataFilename)){
XmlDocument Doc=new XmlDocument();
Doc.Load(DataFilename);
XmlNode N=Doc.DocumentElement.FirstChild;
while(N!=null){ //Iterate through the nodes
if(!MyData.ContainsKey(N.Name)){ //If the dictionary does not contain the node name, add it and the text it contains.
MyData.Add(N.Name,N.InnerText);
}
N=N.NextSibling;
}
}
//Add any new Name and Value values sent to the page.
string Name=Context.Request["Name"];
string Value=Context.Request["Value"];
if(!String.IsNullOrEmpty(Name)){
if(!MyData.ContainsKey(Name)){ //If the dictionary does not contain the name, add it and the value.
MyData.Add(Name,Value);
}else{ //Replace the value if the name already exists in the dictionary.
MyData[Name]=Value;
}
DataChanged=true;
}
//Generate a new xml file.
StringBuilder NewXML=new StringBuilder();
NewXML.Append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n");
NewXML.Append("<Data>\r\n");
Dictionary<string,string>.Enumerator Enum=MyData.GetEnumerator();
while(Enum.MoveNext()){
NewXML.Append("<"+Enum.Current.Key+">"+HttpUtility.HtmlEncode(Enum.Current.Value)+"</"+Enum.Current.Key+">\r\n");
}
NewXML.Append("</Data>\r\n");
//Save the data file if it has been changed.
if(DataChanged){
StreamWriter SW = new StreamWriter(DataFilename);
SW.WriteLine(NewXML.ToString());
SW.Close();
}
//Return the xml file.
Context.Response.ContentType = "text/xml";
Response.Write(NewXML.ToString());
%>
La page du serveur ASPX gère la manipulation d'un fichier XML.
Si le fichier XML existe, puis l'ASPX charge les données XML dans un dictionnaire. Ensuite, il vérifie pour voir si toutes les nouvelles valeurs ont été reçues. S'il y a une nouvelle valeur, l'ajouter au dictionnaire, mettre à jour la valeur actuelle si celui-ci existe déjà. Il crée ensuite un nouveau fichier XML basé sur le dictonary. S'il y avait une nouvelle valeur ajoutée, le nouveau fichier XML est enregistré. Enfin, le code XML est retourné.
Vous pouvez tester la page en l'ouvrant dans n'importe quel navigateur web.
Données sont envoyées par le chargement de la page ASPX et notamment un nom et une valeur.
Par exemple :
http://www.MyWebServer.com/XMLDatabase.aspx?Name=HighScore&Value=10000
http://www.MyWebServer.com/XMLDatabase.aspx?Name=PlayerName&Value=Zara
http://www.MyWebServer.com/XMLDatabase.aspx?Name=Location&Value=France
Les données seront à stocker dans un fichier XML qui ressemble à ceci :
<Data>
<HighScore>10000</HighScore>
<PlayerName>Zara</PlayerName>
<Location>France</Location>
</Data>
Il s'agit d'un exemple de comment envoyer des données à la page ASPX dans Hippani Animator.
var Name="HighScore";
var Value="10000";
OpenXMLUrl("http://www.MyWebServer.com/XMLDatabase.aspx?Name="+escape(Name)+"&Value="+escape(Value),Result);
function Result(XML){
if(XML.status==200){
alert("Saved.");
}else{
alert("Error Code "+XML.status);
}
}
Données sont reçues en chargeant simplement le fichier ASPX.
Par exemple :
http://www.MyWebServer.com/XMLDatabase.aspx
Il s'agit d'un exemple de la façon d'obtenir des données de la page ASPX dans Hippani Animator.
OpenXMLUrl("http://www.MyWebServer.com/XMLDatabase.aspx",Result);
function Result(XML){
if(XML.status==200){
var Node=XML.documentElement.firstChild;
var List="List:\r\n";
while(Node!=null){
List+=Node.nodeName+"="+Node.firstChild.nodeValue+"\r\n";
Node=Node.nextSibling;
}
alert(List);
}else{
alert(XML.status+" Error!!!");
}
}
Plusieurs bases de données Record
Cette base de données plus complexe stocke une liste d'enregistrements. Chaque enregistrement contient une liste de valeurs. Chaque valeur a un nom.
Par exemple :
Fiche 1 :
FirstName=Andrew
Age=23
Fiche 2 :
FirstName=Andrea
Age=42
Ce type de base de données XML fonctionne efficacement pour jusqu'à 100 enregistrements. Bases de données plus grandes auraient besoin non plus de plusieurs fichiers XML ou être connectés à une base de données approprié, tel que SQL.
Créez un autre fichier ASPX sur votre serveur web appelé XMLDatabase2.aspx. Utilisez le code suivant.
<%@ Page Language="C#" %>
<%@ Import namespace="System.IO" %>
<%@ Import namespace="System.Xml" %>
<%@ Import namespace="System.Collections.Generic" %>
<%
string DataFilename=Server.MapPath("Data2.xml");
Dictionary<int,Dictionary<string,string>> MyData=new Dictionary<int,Dictionary<string,string>>();
bool DataChanged=false;
Dictionary<string,string> Record=null;
int Index=0;
// Load the xml data into a dictionary
if(File.Exists(DataFilename)){
XmlDocument Doc=new XmlDocument();
Doc.Load(DataFilename);
XmlNode N=Doc.DocumentElement.FirstChild,M=null;
while(N!=null){ //Iterate through the record nodes
Index=Convert.ToInt32(N.Attributes["Index"].Value); //Get the index value of the record.
Record=new Dictionary<string,string>();
M=N.FirstChild;
while(M!=null){ //Iterate through the value nodes
if(!Record.ContainsKey(M.Name)){ //If the record does not contain the node name, add it and the text it contains.
Record.Add(M.Name,M.InnerText);
}
M=M.NextSibling;
}
if(!MyData.ContainsKey(Index)){ //If the dictionary does not contain the record index, add it.
MyData.Add(Index,Record);
}
N=N.NextSibling;
}
}
//Add any new Name and Value values sent to the page. Use the Index value to locate the correct record.
string Name=Context.Request["Name"];
string Value=Context.Request["Value"];
Index=Convert.ToInt32(Context.Request["Index"]);
if(!String.IsNullOrEmpty(Name)&&Index>0){
if(MyData.ContainsKey(Index)){ //If the dictionary contains the record index.
Record=MyData[Index];
}else{ //If the dictionary does not contain the record. Create a new empty record and add it.
Record=new Dictionary<string,string>();
MyData.Add(Index,Record);
}
if(!Record.ContainsKey(Name)){ //If the record does not contain the name, add it and the value.
Record.Add(Name,Value);
}else{ //Replace the value if the name already exists in the record.
Record[Name]=Value;
}
DataChanged=true;
}
//Generate a new xml file.
StringBuilder NewXML=new StringBuilder();
NewXML.Append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n");
NewXML.Append("<Data>\r\n");
Dictionary<int,Dictionary<string,string>>.Enumerator Enum=MyData.GetEnumerator();
Dictionary<string,string>.Enumerator EnumRecord;
while(Enum.MoveNext()){
NewXML.Append("<Record Index=\""+Enum.Current.Key+"\">\r\n");
EnumRecord=Enum.Current.Value.GetEnumerator();
while(EnumRecord.MoveNext()){
NewXML.Append("<"+EnumRecord.Current.Key+">"+HttpUtility.HtmlEncode(EnumRecord.Current.Value)+"</"+EnumRecord.Current.Key+">\r\n");
}
NewXML.Append("</Record>\r\n");
}
NewXML.Append("</Data>\r\n");
//Save the data file if it has been changed.
if(DataChanged){
StreamWriter SW = new StreamWriter(DataFilename);
SW.WriteLine(NewXML.ToString());
SW.Close();
}
//Return the xml file.
Context.Response.ContentType = "text/xml";
Response.Write(NewXML.ToString());
%>
Cette page du serveur ASPX est plus complexe. De plus, il gère la manipulation d'un fichier XML.
Si le fichier XML existe, puis l'ASPX charge les données XML dans un dictionnaire. Ensuite, il vérifie pour voir si toutes les nouvelles valeurs ont été reçues. S'il y a une nouvelle valeur et un index, ajoutez-le à l'enregistrement dans le dictionnaire, mettre à jour la valeur actuelle si celui-ci existe déjà. Il crée ensuite un nouveau fichier XML basé sur le dictonary. S'il y avait une nouvelle valeur ajoutée, le nouveau fichier XML est enregistré. Enfin, le code XML est retourné.
Vous pouvez tester la page en l'ouvrant dans n'importe quel navigateur web.
Données sont envoyées par le chargement de la page ASPX et notamment un indice, le nom et la valeur.
Par exemple :
http://www.MyWebServer.com/XMLDatabase2.aspx?Index=1&Name=FirstName&Value=Andrew
http://www.MyWebServer.com/XMLDatabase2.aspx?Index=1&Name=Age&Value=23
http://www.MyWebServer.com/XMLDatabase2.aspx?Index=2&Name=FirstName&Value=Andrea
http://www.MyWebServer.com/XMLDatabase2.aspx?Index=2&Name=Age&Value=42
Les données seront à stocker dans un fichier XML qui ressemble à ceci :
<Data>
<Record Index="1">
<FirstName>Andrew</FirstName>
<Age>23</Age>
</Record>
<Record Index="2">
<FirstName>Andrea</FirstName>
<Age>42</Age>
</Record>
</Data>
Il s'agit d'un exemple de comment envoyer des données à la page ASPX dans Hippani Animator.
var Index=1;
var Name="FirstName";
var Value="Andrew";
OpenXMLUrl("http://www.MyWebServer.com/XMLDatabase2.aspx?Index="+Index+"&Name="+escape(Name)+"&Value="+escape(Value),Result);
function Result(XML){
if(XML.status==200){
alert("Saved.");
}else{
alert("Error Code "+XML.status);
}
}
Données sont reçues en chargeant simplement le fichier ASPX.
Par exemple :
http://www.MyWebServer.com/XMLDatabase.aspx
Il s'agit d'un exemple de la façon d'obtenir des données de la page ASPX dans Hippani Animator.
OpenXMLUrl("http://www.MyWebServer.com/XMLDatabase2.aspx",Result);
function Result(XML){
if(XML.status==200){
var Record=XML.documentElement.firstChild,Node=null;
var List="List:\r\n";
while(Record!=null){
List+="Record: "+Record.attributes.getNamedItem("Index").value+"\r\n";
Node=Record.firstChild;
while(Node!=null){
List+=" "+Node.nodeName+"="+Node.firstChild.nodeValue+"\r\n";
Node=Node.nextSibling;
}
Record=Record.nextSibling;
}
alert(List);
}else{
alert(XML.status+" Error!!!");
}
}
Cette documentation a été traduite de l'anglais, à l'aide d'un traducteur en ligne. Nous nous excusons si vous trouvez des erreurs. Si vous souhaitez nous aider à apporter des corrections. Il y a un éditeur de la traduction en Hippani Animator (dans le menu aide). Nous donner les clés de licence libre à toute personne qui corrige plus de 100 phrases. S'il vous plaît nous contacter pour plus de détails.