لقد رأيت مقالًا على الإنترنت وجربته بنفسي، ومن المؤكد أن XMLTextReader أسرع!
يمكن لفئة XMLTextReader المضمنة في مساحة اسم System.XML الخاصة بـ .NET Framework قراءة البيانات من ملفات XML بسرعة دون أن تتطلب الكثير من موارد النظام. استخدم فئة XMLTextReader لقراءة البيانات من ملفات XML وتحويلها إلى تنسيق HTML للإخراج في المتصفح.
قبل قراءة هذه المقالة، يحتاج القراء إلى فهم بعض المعرفة الأساسية: XML، HTML، لغة برمجة C#، وبعض المعرفة بـ .NET، وخاصة إطار عمل ASP.NET.
يوفر إطار عمل Microsoft.NET للمطورين العديد من وسائل الراحة للتطوير مع استمرار تزايد أهمية XML، يتطلع المطورون إلى تطوير مجموعة كاملة من أدوات XML القوية. لقد حقق إطار عمل .NET توقعاتنا وقام بتنظيم الفئات التالية لـ XML في مساحة اسم System.XML:
XMLTextReader ------ يوفر وصولاً سريعًا وأحادي الاتجاه وغير مخزن إلى بيانات XML. (يعني الاتجاه الواحد أنه يمكنك فقط قراءة ملف XML من الأمام إلى الخلف، وليس العكس)
XMLValidatingReader ------ يستخدم مع فئة XMLTextReader، فهو يوفر القدرة على التحقق من مخططات DTD وXDR وXSD.
XMLDocument ------ يتبع المعايير الأساسية والثانوية لمواصفات نموذج كائن مستند W3C لتحقيق الوصول العشوائي والمخزن مؤقتًا إلى بيانات XML. يحتوي المستوى الأول على الأجزاء الأساسية لـ DOM، بينما يضيف المستوى الثاني مجموعة متنوعة من التحسينات، بما في ذلك إضافة دعم لمساحات الأسماء والمخططات المتتالية (CSS).
XMLTextWriter ------ إنشاء ملفات XML تتوافق مع مواصفات W3C XML 1.0.
تتحدث هذه المقالة بشكل أساسي عن XMLTextReader من الدرجة الأولى والغرض من هذه الفئة هو قراءة البيانات بسرعة من ملفات XML دون فرض متطلبات عالية على موارد النظام (بما في ذلك الذاكرة ووقت المعالج بشكل أساسي). تحت سيطرة البرنامج الأصلي، فإنه ينفذ عملية العمل هذه عن طريق تشغيل ملف XML تدريجيًا عن طريق معالجة عقدة واحدة فقط في كل مرة. في كل عقدة من ملف XML، يمكن للبرنامج الأصلي تحديد نوع العقدة وسماتها وبياناتها (إن وجدت)، وغيرها من المعلومات حول العقدة. بناءً على هذه المعلومات، يمكن للبرنامج الأصلي اختيار معالجة هذه العقدة أو تجاهل معلومات العقدة لتلبية احتياجات طلبات التطبيقات المختلفة. يُسمى هذا بنموذج معالجة السحب لأن البرنامج الأصلي يقوم بالطلب ويستخرج العقد الفردية من ملف XML ثم يعالجه أو لا يعالجه حسب الحاجة.
يمكننا مقارنة فئة XMLTextReader مع واجهة برمجة التطبيقات البسيطة XML، أو SAX، وهي تقنية أخرى لقراءة بيانات XML تحظى بشعبية كبيرة بين المبرمجين. يتشابه XMLTextReader وSAX إلى حد كبير من حيث أنه بإمكانهما قراءة البيانات من ملفات XML بسرعة دون استهلاك الكثير من موارد النظام. ومع ذلك، على عكس نموذج الاستخراج الخاص بـ XMLTextReader، يستخدم SAX نموذج الدفع: يستخدم معالج XML "الأحداث" لإعلام التطبيق المضيف ببيانات العقدة المتاحة والتي لا يمكن الحصول عليها حسب الحاجة، ويستجيب البرنامج المضيف وفقًا لذلك أو يتجاهلها . بمعنى آخر، يتم دفع البيانات من معالج SAX إلى المضيف. لا بد أن يناقش المبرمجون ما إذا كانت نماذج المعالجة القابلة للسحب أو الدفع للداخل تتمتع بمزايا أكثر، ولكن لا يمكن إنكار أن كلا النموذجين يعملان بشكل جيد. لا يدعم .NET Framework SAX، ولكن يمكنك استخدام أدوات SAX الموجودة، مثل المحلل اللغوي MSXML، مع تطبيقات .NET الخاصة بك.
تحتوي فئة XMLTextReader على مُنشئات لاستيعاب مجموعة متنوعة من المواقف، مثل قراءة البيانات من دفق بيانات موجود أو محدد موقع الموارد. في أغلب الأحيان، قد ترغب في قراءة بيانات XML من ملف، ويوجد مُنشئ مقابل لخدمة هذا. فيما يلي مثال (جميع أمثلة التعليمات البرمجية الخاصة بي موجودة في لغة C#، ومن السهل تحويلها إذا كنت تفضل استخدام VISUAL BASIC).
XMLTextReader myReader;
myReader = New XMLTextReader("c:datasales.XML")
ينشئ حلقة تسمى أسلوب القراءة () تكون قيمة الإرجاع لهذه الطريقة صحيحة دائمًا حتى تصل إلى أسفل الملف، عندما تصبح القيمة المرجعة خاطئة . بمعنى آخر، تبدأ الحلقة في بداية الملف وتقرأ في جميع العقد، واحدة تلو الأخرى، حتى يتم الوصول إلى نهاية الملف:
while (myReader.Read()) {
...
// معالجة كل عقدة هنا.
...
}
بعد كل استدعاء ناجح لـ Read()، يحتوي برنامج إنشاء مثيل XMLTextReader على معلومات حول العقدة الحالية (أي العقدة التي تمت قراءتها للتو من الملف). يمكننا الحصول على المعلومات المذكورة أعلاه من أعضاء XMLTextReader، تمامًا كما هو موضح في الجدول 1 وتحديد نوع العقدة الحالية من خلال سمة NodeType. بناءً على نوع العقدة، يمكن لرمز البرنامج قراءة بيانات العقدة والتحقق مما إذا كانت تحتوي على سمات وما إذا كان سيتم تجاهلها أو إجراء العمليات والمعالجة المقابلة وفقًا لاحتياجات البرنامج.
عند استخدام سمة NodeType، من المهم فهم كيفية ارتباط العقد بخلايا XML. على سبيل المثال، انظر إلى عنصر XML التالي:
<city>Chongqing</city>
يعتبر XMLtextReader هذا العنصر بمثابة 3 عقد، بالترتيب التالي:
1. تتم قراءة العلامة <city> كعقدة من النوع XMLNodeType.Element، ويمكن الحصول على اسم العنصر "city" من سمة الاسم الخاصة بـ XMLTextReader.
2. تتم قراءة البيانات النصية "Chongqing" كعقدة من النوع XMLNodeType.Text. يمكن الحصول على بيانات "Chongqing" من سمة القيمة الخاصة بـ XMLTextReader.
3. تتم قراءة العلامة </city> كعقدة من النوع XMLNodeType.EndElement. وبالمثل، يتوفر اسم العنصر "المدينة" من خاصية اسم XMLTextReader.
هذه ثلاثة أنواع مهمة من العقد تم وصفها بالتفصيل في وثائق .NET.
إذا واجه XMLTextReader خطأً، مثل انتهاك بناء جملة XML، فإنه يطرح استثناءً من النوع System.XML.XMLException. يجب دائمًا حماية التعليمات البرمجية التي تستخدم هذه الفئة (في كتلة Try...Catch)، كما سترى لاحقًا في البرنامج التجريبي.
هذه المقالة مجرد مقدمة بسيطة إلى حد ما لفئة XMLTextReader تحتوي فئة XMLTextReader على عدد قليل من الأعضاء، ومن المستحيل ذكرهم جميعًا هنا. يوفر XMLTextReader مرونة كبيرة عند قراءة بيانات XML. ومع ذلك، ما زلت ناقشت الكثير لضمان قدرة القراء على كتابة برامج لتحقيق المهام التي غالبًا ما تكون مطلوبة في العالم الحقيقي، وهي قراءة البيانات من ملف XML ثم إخراجها بتنسيق HTML لتنفيذها في المتصفح. عرض.
يعمل برنامج ASP.NET (البرنامج النصي) على الخادم ويقوم بإنشاء صفحة HTML مرة أخرى إلى المتصفح. يتم توفير البرنامج النصي في المقتطف 1، ويتم توفير ملف بيانات XML الذي يعمل معه في المقتطف 2. يمكنك أن ترى أن ملف XML هذا يحتوي على قائمة العلاقات؛ هدف البرنامج هو عرض هذه القائمة، والتي تم تنسيقها لتسهيل رؤيتها.
تشغيل البرنامج:
1. احفظ مقتطف التعليمات البرمجية 1 كملف XMLTextReader.ASPx ومقتطف التعليمات البرمجية 2 كملف XMLData.XML.
2. ضع كلا الملفين في مجلد افتراضي على خادم ويب مثبت عليه .NET Framework.
3. افتح Internet Explorer واستعرض للوصول إلى ملف ASPx، على سبيل المثال، على خادم LAN، سيكون عنوان URL هو http://localhost/xmltextreader.ASPx ؛.
يتم تنفيذ معظم عمل البرنامج بواسطة فئة XMLDisplay، وتحديدًا بواسطة طريقة ProcessXML(). يقرأ بيانات XML لعقدة واحدة في كل مرة بالنسبة للعنصر محل الاهتمام، سيتم كتابة بيانات العقدة واسم العقدة متبوعًا بنقطتين في نتيجة الإخراج مع علامة تنسيق HTML المقابلة. في هذه المرحلة، تتكون "نتيجة الإخراج" من كائن StringBuilder حيث يتم تخزين نص HTML مؤقتًا.
يتم استدعاء الأسلوب ProcessXML() من الأسلوب LoadDocument(). المهمة التي تؤديها هذه الطريقة هي إنشاء برنامج إنشاء XMLTextReader وتحميل ملف XML قبل استدعاء ProcessXML. كما أنه يعالج الاستثناءات وينشئ بعد ذلك رسائل خطأ ويعرضها في المتصفح. في النهاية، تقوم الطريقة بإرجاع سلسلة تحتوي إما على محتوى HTML الذي تم إنشاؤه أو رسالة خطأ في حالة حدوث استثناء.
يبدأ تنفيذ البرنامج ببرنامج Page_Load() عندما يطلب المتصفح تصفح هذه الصفحة، سيتم تنفيذ هذه الخطوة تلقائيًا. يقوم الكود هنا بإنشاء مثيل لفئة XMLDisplay ويستدعي أسلوب LoadDocument() الخاص به. إذا كان كل شيء يعمل بشكل طبيعي، فسيتم نسخ قيمة إرجاع HTML المنسقة إلى علامة <div> على الصفحة، وسيتم إرسال مستند HTML الذي تم إنشاؤه مرة أخرى إلى المتصفح وعرضه.
كيف تعمل فئات .NET Framework الأخرى، مثل فئة XMLDocument، في قراءة بيانات XML؟ تختلف فئة XMLDocument عن فئة XMLTextReader من حيث أنها تقوم بإنشاء شجرة عقدة لمستند XML بأكمله في الذاكرة. بهذه الطريقة، يمكن الحصول على بيانات XML بشكل عشوائي (تمامًا على عكس الطريقة الخطية التي تحصل بها فئة XMLTextReader على البيانات)، وتتمتع بمرونة مثالية عند تعديل البيانات وبنية ملف XML. بالإضافة إلى ذلك، يسمح لك XMLDocument بإجراء تحويلات XSLT، لكن هذه الميزات الإضافية تأتي على حساب سرعة تشغيل أبطأ واستخدام أكبر لموارد النظام.
مقتطف التعليمات البرمجية 1: XmlTextReader.aspx
<%@ Import Namespace="System.Xml" %>
<script language="C#" runat=server>
الفئة العامة XmlDisplay
file://يقوم هذا الفصل بقراءة ومعالجة ملفات XML.
{
سلسلة عامة LoadDocument(سلسلة XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = new StringBuilder();
يحاول {
يقوم الملف:// بإنشاء مثيل لـ XMLTextReader.
xmlReader = new XmlTextReader(XmlFileName);
// معالجة ملفات XML
html.Append(ProcessXml(xmlReader));
}
التقاط (XmlException على سبيل المثال){
html.Append("حدث استثناء في XML:" +
ex.ToString());
}
قبض (استثناء على سبيل المثال) {
html.Append("حدث استثناء شائع:" +
ex.ToString());
}
أخيراً
{
إذا (xmlReader! = فارغ)
xmlReader.Close();
}
إرجاع html.ToString();
}
سلسلة خاصة ProcessXml(XmlTextReader xmlReader)
{
StringBuilder temp = new StringBuilder();
:// تقوم هذه الطريقة بقراءة ملف XML وإنشاء مستند HTML الناتج.
بينما (xmlReader.Read())
{
// التعامل مع بداية عقدة العنصر.
إذا (xmlReader.NodeType == XmlNodeType.Element)
{
file://ignores <people> و<person> العناصر
إذا ((xmlReader.Name != "شخص") && (xmlReader.Name != "أشخاص"))
{
file://إذا كان عنصر <category>، فابدأ فقرة جديدة
إذا (xmlReader.Name == "الفئة")
temp.Append("<p>");
file:// يضيف أسماء العناصر إلى الإخراج
temp.Append(xmlReader.Name + ": ");
}
}
// معالجة العقد النصية
وإلا إذا (xmlReader.NodeType == XmlNodeType.Text)
temp.Append(xmlReader.Value + "<br>");
file:// يعالج نهاية عقدة العنصر
وإلا إذا (xmlReader.NodeType == XmlNodeType.EndElement)
{
إذا كان file:// عبارة عن عقدة <email>، أضف علامة لإنهاء الفقرة.
إذا (xmlReader.Name == "البريد الإلكتروني")
temp.Append("</p>");
}
}// إنهاء الحلقة while
return temp.ToString();
} file://End ProcessXML way
} file://End XmlDisplay class
public void Page_Load(Object sender, EventArgs e){
file://إنشاء مثيل لفئة XmlDisplay
XmlDisplay XmlDisplayDemo = new XmlDisplay();
put.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
}
</ نص >
<أتش تي أم أل>
<الرأس>
</الرأس>
<الجسم>
<h2>فئة العرض التوضيحي XmlTextReader</h2>
<div id="output" runat="server"/>
</ الجسم>
</أتش تي أم أل>
1 فراغ ثابت رئيسي (سلسلة [] وسيطات)
2 {
3 DateTime d1 =DateTime.Now;
4 XmlDocumentTest();
5 DateTime d2 =DateTime.Now;
6 TimeSpan ts =d2-d1;
7
8 Console.WriteLine(ts.TotalMillithans);
9 Console.Read();
10
11 }
12
13
14 سلسلة ثابتة عامة XmlFileName = "../../XML/1.xml";
15
16 فراغًا ثابتًا خاصًا XmlTextReaderTest()
17 {
18 XmlTextReader Reader = new XmlTextReader(XmlFileName);
19 بينما (reader.Read() )
20 {
21 خروج منطقي = خطأ؛
22 مفتاح (قارئ.نوع العقدة)
ثلاثة وعشرين {
24 حالة XmlNodeType.Element:
25 استراحة؛
26 حالة XmlNodeType.Text:
27 إذا (reader.Value = = "الأخير")
28 {
29 خروج = صحيح؛
30}
31 استراحة؛
32 حالة XmlNodeType.EndElement:
33 استراحة؛
34 الافتراضي:
35 استراحة؛
36}
37 إذا(خروج)
38 {
39 عودة؛
40
41 }
42
43}
44}
45
46 فراغ ثابت خاص XmlDocumentTest()
47 {
48 XmlDocument xd =new XmlDocument();
49 xd.Load(XmlFileName);
50 عقدة XmlNode = xd.SelectSingleNode("/people/person[category='last']");
51 Console.Write(node.Name);
52 }
اتضح أن الأول يستغرق وقتًا طويلاً:
اتضح أن الخيار الثاني يستغرق وقتًا طويلاً:
http://www.cnblogs.com/goody9807/archive/2006/10/24/534888.html