XML-databaser
Detta avancerade ämne visar hur du kan skapa två typer av mycket enkel XML-databaser.
Läsa XML är rakt fram. Det är dock omöjligt att spara XML direkt från HTML eller Hippani Animator på grund av säkerhetsbegränsningar. En server sida krävs att interagera med webbservern. Vi har använt ASPX serversidor skrivna i C#. Andra server-sidor och språk kan användas i stället. ASPX och C# är utanför omfånget för denna dokumentation. Om du vill anpassa och expandera på dessa exempel, kan det krävas ytterligare läsning.
Du behöver ett Microsoft Windows webbserver (IIS) som värd för ASPX-filer. Du måste också ställa in webbserverbehörigheter att skapa och skriva filer.
Enda rekord databaser
Denna enkla databas lagras en lista med värden. Varje värde har ett namn.
Till exempel:
HighScore=10000
PlayerName=Zara
Location=France
Skapa en ASPX-fil på din webbserver som kallas XMLDatabase.aspx. Använd följande kod. En ASPX-fil är helt enkelt en textfil med filtillägget .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());
%>
Sidan ASPX server hanterar manipulering av en XML-fil.
Om XML-filen finns, sedan ASPX läser in XML-data i en ordbok. Den kontrollerar sedan om nya värden har tagits emot. Om det finns ett nytt värde, lägga till i ordlistan, uppdatera det aktuella värdet om det redan finns. Därefter skapas en ny XML-fil baserat på ordboken. Om det fanns en ny mervärde, sparas den nya XML-filen. Slutligen returneras XML.
Du kan testa sidan genom att öppna den i en webbläsare.
Data skickas av lastning på ASPX-sidan och inklusive namn och värde.
Till exempel:
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
Data kommer att förvaras i en XML-fil som ser ut så här:
<Data>
<HighScore>10000</HighScore>
<PlayerName>Zara</PlayerName>
<Location>France</Location>
</Data>
Detta är ett exempel på hur du skickar data till ASPX-sidan i 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);
}
}
Data tas emot genom att enkelt ladda filen ASPX.
Till exempel:
http://www.MyWebServer.com/XMLDatabase.aspx
Detta är ett exempel på hur man får data från ASPX-sidan i 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!!!");
}
}
Flera rekord databaser
Denna mer komplexa databas lagrar en lista över poster. Varje post innehåller en lista med värden. Varje värde har ett namn.
Till exempel:
Rekord 1:
FirstName=Andrew
Age=23
Post 2:
FirstName=Andrea
Age=42
Denna typ av XML database fungerar effektivt för upp till 100 poster. Större databaser skulle antingen behöva flera XML-filer eller vara ansluten till en ordentlig databas som SQL.
Skapa en annan ASPX-fil på din webbserver som kallas XMLDatabase2.aspx. Använd följande kod.
<%@ 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());
%>
Här ASPX serversidan är mer komplex. Igen, den hanterar manipulering av en XML-fil.
Om XML-filen finns, sedan ASPX läser in XML-data i en ordbok. Den kontrollerar sedan om nya värden har tagits emot. Om det finns ett nytt värde och ett index, lägga till posten i ordlistan, uppdatera det aktuella värdet om det redan finns. Därefter skapas en ny XML-fil baserat på ordboken. Om det fanns en ny mervärde, sparas den nya XML-filen. Slutligen returneras XML.
Du kan testa sidan genom att öppna den i en webbläsare.
Data skickas av lastning på ASPX-sidan och med index, namn och värde.
Till exempel:
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
Data kommer att förvaras i en XML-fil som ser ut så här:
<Data>
<Record Index="1">
<FirstName>Andrew</FirstName>
<Age>23</Age>
</Record>
<Record Index="2">
<FirstName>Andrea</FirstName>
<Age>42</Age>
</Record>
</Data>
Detta är ett exempel på hur du skickar data till ASPX-sidan i 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);
}
}
Data tas emot genom att enkelt ladda filen ASPX.
Till exempel:
http://www.MyWebServer.com/XMLDatabase.aspx
Detta är ett exempel på hur man får data från ASPX-sidan i 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!!!");
}
}
Denna dokumentation var översatt från engelska, använder en online översättare. Vi ber om ursäkt om du hittar några fel. Om du vill hjälpa oss att göra korrigeringar. Det finns en översättning editor i Hippani Animator (i Hjälp-menyn). Vi ger ut gratis licensnycklar till vem som helst som korrigerar mer än 100 fraser. Kontakta oss för mer information.