XML-Databases
Dit geavanceerde onderwerp laat zien hoe om twee soorten zeer eenvoudige XML-databases te maken.
Lezing XML is ongecompliceerd. Nochtans, is het onmogelijk om op te slaan XML rechtstreeks van HTML- of Hippani Animator vanwege beveiligingsbeperkingen. Een pagina van de server is vereist voor interactie met de webserver. We hebben server ASPX-pagina's geschreven in C# gebruikt. Andere server pagina's en talen kunnen in plaats daarvan worden gebruikt. Aspx- en C# zijn buiten het bereik van deze documentatie. Als u wilt aanpassen en uitbreiden van deze voorbeelden, kan verder lezen worden verlangd.
U moet een Microsoft Windows-webserver (IIS) voor het hosten van de ASPX-bestanden. U moet ook het instellen van machtigingen voor de webserver te maken en schrijven van bestanden.
Één Record Databases
Deze eenvoudige database slaat een lijst van waarden. Elke waarde heeft een naam.
Bijvoorbeeld:
HighScore=10000
PlayerName=Zara
Location=France
Maak een aspx-bestand op uw webserver genaamd XMLDatabase.aspx. Gebruik de volgende code. Een aspx-bestand is gewoon een tekstbestand met de extensie .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());
%>
De aspx-server pagina verwerkt de gegevens van een XML-bestand.
Als het XML-bestand bestaat, laadt de ASPX de XML-gegevens in een 'dictionary'. Vervolgens wordt gecontroleerd of er nieuwe waarden zijn ontvangen. Als er nieuwe waarden zijn, voegt het deze toe aan de 'dictionary', of past een bestaand gegeven aan. Het maakt vervolgens een nieuw XML-bestand aan op basis van de bijgewerkte 'dictionary'. Is er verschil tussen dit nieuwe XML-bestand en de originele versie dan wordt het nieuwe XML-bestand opgeslagen. Tenslotte wordt het XML-bestand geretourneerd.
U kunt de pagina testen door deze te openen in een willekeurige webbrowser.
Gegevens meezenden doet u in dit geval door de ASPX-pagina te laden met een naam en een waarde voor elk gegeven.
Bijvoorbeeld:
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
De gegevens zullen worden opgeslagen in een XML-bestand dat er alsvolgt kan uitzien:
<Data>
<HighScore>10000</HighScore>
<PlayerName>Zara</PlayerName>
<Location>France</Location>
</Data>
Dit is een voorbeeld van hoe gegevens te sturen naar de ASPX-pagina in 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);
}
}
Gegevens wordt ontvangen door gewoon laden van het ASPX-bestand.
Bijvoorbeeld:
http://www.MyWebServer.com/XMLDatabase.aspx
Dit is een voorbeeld van hoe je gegevens uit de ASPX-pagina in 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!!!");
}
}
Meerdere records Databases
Deze meer complexe database slaat een lijst met records. Elke record bevat een lijst met waarden. Elke waarde heeft een naam.
Bijvoorbeeld:
Record 1:
FirstName=Andrew
Age=23
Record 2:
FirstName=Andrea
Age=42
Dit type XML-database werkt effectief voor maximaal 100 records. Grotere databases zou ofwel moeten meerdere XML-bestanden of worden aangesloten op een goede database zoals SQL.
Maak een ander aspx-bestand op uw webserver genaamd XMLDatabase2.aspx. Gebruik de volgende code.
<%@ 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());
%>
Deze aspx-server pagina is complexer. Nogmaals, het verwerkt de gegevens van een XML-bestand.
Als het XML-bestand bestaat, laadt de ASPX de XML-gegevens in een 'dictionary'. Vervolgens wordt gecontroleerd of er nieuwe waarden zijn ontvangen. Als er nieuwe waarden zijn, voegt het deze toe aan de 'dictionary', of past een bestaand gegeven aan. Het maakt vervolgens een nieuw XML-bestand aan op basis van de bijgewerkte 'dictionary'. Is er verschil tussen dit nieuwe XML-bestand en de originele versie dan wordt het nieuwe XML-bestand opgeslagen. Tenslotte wordt het XML-bestand geretourneerd.
U kunt de pagina testen door deze te openen in een willekeurige webbrowser.
Gegevens meezenden doet u in dit geval door de ASPX-pagina te laden met een index, een naam en een waarde voor elk gegeven.
Bijvoorbeeld:
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
De gegevens zullen worden opgeslagen in een XML-bestand dat er alsvolgt kan uitzien:
<Data>
<Record Index="1">
<FirstName>Andrew</FirstName>
<Age>23</Age>
</Record>
<Record Index="2">
<FirstName>Andrea</FirstName>
<Age>42</Age>
</Record>
</Data>
Dit is een voorbeeld van hoe gegevens te sturen naar de ASPX-pagina in 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);
}
}
Gegevens wordt ontvangen door gewoon laden van het ASPX-bestand.
Bijvoorbeeld:
http://www.MyWebServer.com/XMLDatabase.aspx
Dit is een voorbeeld van hoe je gegevens uit de ASPX-pagina in 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!!!");
}
}
Deze documentatie is vertaald uit het Engels, met behulp van een online vertaler. Wij verontschuldigen ons als u eventuele fouten kunt vinden. Als u helpen ons correcties aan te brengen willen zou. Er is een vertaling editor in Hippani Animator (In het helpmenu). We geven gratis licentie sleutels aan iedereen die meer dan 100 zinnen corrigeert. Neem contact met ons op voor meer informatie.