قواعد بيانات XML
هذا الموضوع متقدم يوضح كيفية إنشاء نوعين من قواعد بيانات XML بسيطة جداً.
قراءة XML على التوالي إلى الأمام. ومع ذلك، من المستحيل أن حفظ XML مباشرة من HTML أو Hippani Animator بسبب القيود الأمنية. صفحة ملقم مطلوب للتفاعل مع ملقم ويب. لقد استخدمنا ASPX خادم الصفحات المكتوبة في C#. ويمكن استخدام صفحات الخادم ولغات أخرى بدلاً من ذلك. ASPX و C# خارج النطاق من هذه الوثيقة. لتخصيص وتوسيع في هذه الأمثلة، قد يلزم مزيد من القراءة.
وسوف تحتاج إلى ملقم ويب Windows ل Microsoft (IIS) استضافة ملفات ASPX. وسوف تحتاج أيضا تعيين أذونات ملقم ويب إنشاء وكتابة ملفات.
قواعد بيانات سجل واحد
هذه قاعدة بسيطة يقوم بتخزين قائمة بالقيم. كل قيمة له اسم.
فعلى سبيل المثال:
HighScore=10000
PlayerName=Zara
Location=France
إنشاء ملف ASPX على خادم الويب الخاص بك يسمى XMLDatabase.aspx. استخدام التعليمات البرمجية التالية. ملف ASPX ببساطة ملف نصي بالملحق .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 الملقم يعالج التلاعب بملف XML.
في حالة وجود ملف XML، ثم ASPX تحميل بيانات XML في قاموس. ثم أنه التدقيق لمعرفة إذا تم تلقي أية قيم جديدة. إذا كان هناك قيمة جديدة، إضافة إلى القاموس، تحديث القيمة الحالية إذا كان موجوداً بالفعل. ثم أنه يقوم بإنشاء ملف XML جديد استناداً إلى القاموس. إذا كان هناك قيمة مضافة جديدة، يتم حفظ ملف XML جديد. وأخيراً، يتم إرجاع XML.
يمكنك اختبار الصفحة قبل فتحه في أي مستعرض ويب.
يتم إرسال البيانات قبل تحميل صفحة ASPX و بما في ذلك اسم وقيمة.
فعلى سبيل المثال:
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
سوف تكون البيانات مخزن في ملف XML التي تبدو مثل هذا:
<Data>
<HighScore>10000</HighScore>
<PlayerName>Zara</PlayerName>
<Location>France</Location>
</Data>
وهذا مثال على كيفية إرسال البيانات إلى صفحة ASPX في 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);
}
}
يتم تلقي البيانات ببساطة تحميل ملف ASPX.
فعلى سبيل المثال:
http://www.MyWebServer.com/XMLDatabase.aspx
وهذا مثال لكيفية الحصول على البيانات من صفحة ASPX في 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!!!");
}
}
قواعد بيانات متعددة في سجل
يخزن قاعدة بيانات أكثر تعقيداً هذا قائمة بالسجلات. يحتوي كل سجل على قائمة قيم. كل قيمة له اسم.
فعلى سبيل المثال:
سجل 1:
FirstName=Andrew
Age=23
سجل 2:
FirstName=Andrea
Age=42
هذا النوع من قاعدة بيانات XML سيتم العمل بفعالية للسجلات تصل إلى 100. قواعد البيانات الكبيرة ستحتاج أما إلى عدة ملفات XML أو يكون متصلاً بقاعدة بيانات سليمة مثل SQL.
إنشاء ملف ASPX آخر على ملقم ويب الخاص بك يسمى XMLDatabase2.aspx. استخدام التعليمات البرمجية التالية.
<%@ 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());
%>
هذه صفحة ASPX الخادم أكثر تعقيداً. مرة أخرى، فإنه يعالج التلاعب بملف XML.
في حالة وجود ملف XML، ثم ASPX تحميل بيانات XML في قاموس. ثم أنه التدقيق لمعرفة إذا تم تلقي أية قيم جديدة. إذا كان هناك قيمة جديدة، وفهرس، إضافته إلى السجل في القاموس، تحديث القيمة الحالية إذا كان موجوداً بالفعل. ثم أنه يقوم بإنشاء ملف XML جديد استناداً إلى القاموس. إذا كان هناك قيمة مضافة جديدة، يتم حفظ ملف XML جديد. وأخيراً، يتم إرجاع XML.
يمكنك اختبار الصفحة قبل فتحه في أي مستعرض ويب.
يتم إرسال البيانات قبل تحميل الصفحة ASPX ومنها الفهرس واسم وقيمة.
فعلى سبيل المثال:
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
سوف تكون البيانات مخزن في ملف XML التي تبدو مثل هذا:
<Data>
<Record Index="1">
<FirstName>Andrew</FirstName>
<Age>23</Age>
</Record>
<Record Index="2">
<FirstName>Andrea</FirstName>
<Age>42</Age>
</Record>
</Data>
وهذا مثال على كيفية إرسال البيانات إلى صفحة ASPX في 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);
}
}
يتم تلقي البيانات ببساطة تحميل ملف ASPX.
فعلى سبيل المثال:
http://www.MyWebServer.com/XMLDatabase.aspx
وهذا مثال لكيفية الحصول على البيانات من صفحة ASPX في 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!!!");
}
}
تمت ترجمة هذه الوثائق من اللغة الإنكليزية، استخدام مترجم على إنترنت. ونحن نعتذر إذا وجدت أي أخطاء. إذا كنت ترغب في مساعدتنا في إجراء التصحيحات. هناك محرر ترجمة في Hippani Animator (في القائمة تعليمات). ونحن نعطيه مفاتيح الترخيص مجاناً لأي شخص يقوم بتصحيح العبارات أكثر من 100. يرجى الاتصال بنا لمزيد من التفاصيل.