Baz danych XML
Ten zaawansowany temat pokazuje, jak utworzyć dwa rodzaje od bardzo prostych baz danych XML.
Czytanie XML jest prosta. Jednak, to jest niemożliwe, aby zapisać XML bezpośrednio z HTML lub Hippani Animator z powodu ograniczeń zabezpieczeń. Strona serwera jest wymagane do interakcji z serwerem sieci web. Mamy używany serwer ASPX strony napisany w C#. Inne strony serwera i języki mogą być stosowane zamiast. ASPX i C# są poza zakres tej dokumentacji. Aby dostosować i rozszerzyć na tych przykładach, mogą być wymagane dalsze czytanie.
Będziesz potrzebować Mikroskop Windows serwer sieci web (IIS) do obsługi plików ASPX. Musisz również ustawić uprawnienia serwera sieci web do tworzenia i zapisywania plików.
Jeden rekord bazy danych
Ta prosta baza danych przechowuje listę wartości. Każda wartość ma nazwę.
Na przykład:
HighScore=10000
PlayerName=Zara
Location=France
Tworzenie pliku ASPX na serwerze sieci web o nazwie XMLDatabase.aspx. Użyć następującego kodu. Pliku ASPX jest po prostu plikiem tekstowym z rozszerzeniem .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());
%>
Strony ASPX serwer obsługuje manipulacji pliku XML.
Jeśli istnieje plik XML, a następnie ASPX ładuje dane XML do słownika. Następnie sprawdza aby zobaczyć, jeśli otrzymano żadnych nowych wartości. Jeśli istnieje wartość nowe, dodać go do słownika, aktualizacji bieżącą wartość, jeśli już istnieje. Następnie tworzy nowy plik XML oparte na dictonary. Jeśli było nowej wartości dodanej, jest zapisany nowy plik XML. Wreszcie zwracany jest kod XML.
Stronie można sprawdzić, otwierając go w dowolnej przeglądarce sieci web.
Dane są przesyłane przez ładowania strony ASPX i tym nazwę i wartość.
Na przykład:
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
Dane będą przechowywać w pliku XML, który wygląda tak:
<Data>
<HighScore>10000</HighScore>
<PlayerName>Zara</PlayerName>
<Location>France</Location>
</Data>
To jest przykład jak do wysyłania danych do strony ASPX w 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);
}
}
Danych jest odbierane przez po prostu ładowanie pliku ASPX.
Na przykład:
http://www.MyWebServer.com/XMLDatabase.aspx
To jest przykład jak uzyskać dane ze strony ASPX w 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!!!");
}
}
Wiele rekordów bazy danych
Tym bardziej złożone bazy danych przechowuje listę rekordów. Każdy rekord zawiera listę wartości. Każda wartość ma nazwę.
Na przykład:
Zapis 1:
FirstName=Andrew
Age=23
Rekord 2:
FirstName=Andrea
Age=42
Ten typ bazy danych XML będzie działać skutecznie na maksymalnie 100 rekordów. Większe bazy danych albo potrzebuje wielu plików XML lub przyłączania się do odpowiedniej bazy danych takie jak SQL.
Tworzenie innego pliku ASPX na serwerze sieci web o nazwie XMLDatabase2.aspx. Użyć następującego kodu.
<%@ 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());
%>
Tej strony ASPX serwer jest bardziej złożona. Ponownie zajmuje się manipulacji pliku XML.
Jeśli istnieje plik XML, a następnie ASPX ładuje dane XML do słownika. Następnie sprawdza aby zobaczyć, jeśli otrzymano żadnych nowych wartości. Jeśli istnieje wartość i indeks, dodać go do rekordu w słowniku, aktualizacji bieżącą wartość, jeśli już istnieje. Następnie tworzy nowy plik XML oparte na dictonary. Jeśli było nowej wartości dodanej, jest zapisany nowy plik XML. Wreszcie zwracany jest kod XML.
Stronie można sprawdzić, otwierając go w dowolnej przeglądarce sieci web.
Dane są przesyłane przez ładowania strony ASPX i tym indeks, nazwę i wartość.
Na przykład:
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
Dane będą przechowywać w pliku XML, który wygląda tak:
<Data>
<Record Index="1">
<FirstName>Andrew</FirstName>
<Age>23</Age>
</Record>
<Record Index="2">
<FirstName>Andrea</FirstName>
<Age>42</Age>
</Record>
</Data>
To jest przykład jak do wysyłania danych do strony ASPX w 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);
}
}
Danych jest odbierane przez po prostu ładowanie pliku ASPX.
Na przykład:
http://www.MyWebServer.com/XMLDatabase.aspx
To jest przykład jak uzyskać dane ze strony ASPX w 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!!!");
}
}
Dokumentacja ta została przetłumaczona z języka angielskiego, przy użyciu Tłumacz online. Przepraszamy, jeśli znajdziesz jakieś błędy. Jeśli chcesz pomóc nam zrobić korekty. Ma tłumaczenia edytora w Hippani Animator (w menu Pomoc). Dajemy się wolny licencja klucze do nikogo, kto naprawia ponad 100 fraz. Proszę skontaktuj się z nami aby uzyskać więcej informacji.