Indhold

Oprettelse af telefon Apps Publicering i WordPress

XML-databaser


Dette avancerede emne viser, hvordan man opretter to slags meget simple XML-databaser.

At læse XML er ligetil. Det er dog umuligt at gemme XML direkte fra HTML eller Hippani Animator på grund af sikkerhedsbegrænsninger. En serverside er påkrævet til at interagere med web-serveren. Vi har brugt ASPX serversider skrevet i C#. Andre serversider og sprog kan bruges i stedet. ASPX og C# er uden for rammerne af denne dokumentation. For at tilpasse og udvide disse eksempler, kan yderligere læsning være påkrævet.

Du skal bruge en Microsoft Windows webserver (IIS) til at hoste ASPX filer. Du skal også indstille web-servertilladelser til at oprette og skrive filer.


Enkle datapost-databaser

Denne enkle database gemmer en liste over værdier. Hver værdi har et navn.

For eksempel:

HighScore=10000

PlayerName=Zara

Location=France

Opret en ASPX-fil på din webserver, kaldet XMLDatabase.aspx. Brug følgende kode. En ASPX-fil er blot en tekstfil med filtypenavnet .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());
%>


ASPX serversiden håndterer manipulationen af en XML-fil.

Hvis XML-filen findes, indlæser ASPX XML-dataene i en ordbog. Derefter kontrollerer det, om eventuelle nye værdier er blevet modtaget. Hvis der er en ny værdi, føje det til ordbogen, opdatere den aktuelle værdi, hvis den allerede findes. Derefter oprettes der en ny XML-fil baseret på ordbogen. Hvis der var en ny merværdi, gemmes det nye XML-fil. Endelig returneres XML.

Du kan teste siden ved at åbne den i en web-browser.

Data sendes ved at sende ASPX-siden og medtage et navn og en værdi.

For eksempel:

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 bliver gemt i en XML-fil, der ligner denne:


<Data>
<HighScore>10000</HighScore>
<PlayerName>Zara</PlayerName>
<Location>France</Location>
</Data>

Dette er et eksempel på, hvordan man sender data til ASPX-siden 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 modtages ved simpelthen at indlæse filen ASPX.

For eksempel:
http://www.MyWebServer.com/XMLDatabase.aspx

Dette er et eksempel på hvordan man får data fra ASPX-side 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!!!");
}
}

Fler-datapost databaser

Denne mere komplekse database gemmer en liste over poster. Hver post indeholder en liste over værdier. Hver værdi har et navn.

For eksempel:

Post 1:

FirstName=Andrew

Age=23

Post 2:

FirstName=Andrea

Age=42

Denne type af XML database vil arbejde effektivt med op til 100 poster. Større databaser skulle enten bruge flere XML-filer, eller være forbundet med en ordentlig database som SQL.

Opret en anden ASPX-fil til din webserver. Filen kaldes XMLDatabase2.aspx. Brug følgende kode.


<%@ 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());
%>


Denne ASPX serverside er mere kompleks. Igen, håndterer den manipulation af en XML-fil.

Hvis XML-filen findes, indlæser ASPX XML-dataene i en ordbog. Derefter kontrollerer det, om eventuelle nye værdier er blevet modtaget. Hvis der er en ny værdi og et indeks, føj det til posten i ordbogen, opdater den aktuelle værdi, hvis den allerede findes. Derefter oprettes der en ny XML-fil baseret på ordbogen. Hvis der var tilføjet en ny værdi, gemmes det nye XML-fil. Endelig returneres XML.

Du kan teste siden ved at åbne den i en web-browser.

Data sendes ved at sende ASPX-siden og herunder et indeks, navn og værdi.

For eksempel:

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 bliver gemt i en XML-fil, der ligner denne:


<Data>
<Record Index="1">
<FirstName>Andrew</FirstName>
<Age>23</Age>
</Record>
<Record Index="2">
<FirstName>Andrea</FirstName>
<Age>42</Age>
</Record>
</Data>

Dette er et eksempel på, hvordan du sender data til ASPX-side 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 modtages ved simpelthen at indlæse filen ASPX.

For eksempel:
http://www.MyWebServer.com/XMLDatabase.aspx

Dette er et eksempel på hvordan man får data fra ASPX-side 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!!!");
}
}

Oprettelse af telefon Apps Publicering i WordPress
Denne dokumentation var oversat fra engelsk, ved hjælp af en online oversætter. Vi undskylder hvis du finder nogen fejl. Hvis du vil hjælpe os med at foretage rettelser. Der er en oversættelse editor i Hippani Animator (i Hjælpemenuen). Vi giver ud gratis licensnøgler til nogen, der korrigerer mere end 100 sætninger. Kontakt os for flere detaljer.