ฉันเห็นบทความบนอินเทอร์เน็ตและลองด้วยตัวเอง แน่นอนว่า XMLTextReader เร็วกว่า!
คลาส XMLTextReader ที่รวมอยู่ในเนมสเปซ System.XML ของ .NET Framework สามารถอ่านข้อมูลจากไฟล์ XML ได้อย่างรวดเร็วโดยไม่ต้องใช้ทรัพยากรระบบมากนัก ใช้คลาส XMLTextReader เพื่ออ่านข้อมูลจากไฟล์ XML และแปลงเป็นรูปแบบ HTML สำหรับเอาต์พุตในเบราว์เซอร์
ก่อนที่จะอ่านบทความนี้ ผู้อ่านจำเป็นต้องเข้าใจความรู้พื้นฐานบางประการ: XML, HTML, ภาษาการเขียนโปรแกรม C# และความรู้บางประการเกี่ยวกับ .NET โดยเฉพาะกรอบงาน ASP.NET
กรอบงาน .NET ของ Microsoft ช่วยให้นักพัฒนาได้รับความสะดวกในการพัฒนามากมาย เนื่องจากความสำคัญของ XML ยังคงเพิ่มขึ้นอย่างต่อเนื่อง นักพัฒนาจึงตั้งตารอที่จะพัฒนาชุดเครื่องมือ XML อันทรงพลังครบชุด กรอบงาน .NET เป็นไปตามความคาดหวังของเรา และจัดคลาสต่อไปนี้สำหรับ XML ในเนมสเปซ System.XML:
XMLTextReader------ให้การเข้าถึงข้อมูล XML ที่รวดเร็ว ทางเดียว และไม่มีบัฟเฟอร์ (ทางเดียวหมายความว่าคุณสามารถอ่านไฟล์ XML จากด้านหน้าไปด้านหลังเท่านั้น ไม่สามารถย้อนกลับได้)
XMLValidatingReader------ใช้กับคลาส XMLTextReader ทำให้สามารถตรวจสอบ DTD, XDR และ XSD schema ได้
XMLDocument------เป็นไปตามมาตรฐานหลักและรองของข้อกำหนด W3C Document Object Model เพื่อให้ได้การเข้าถึงข้อมูล XML แบบสุ่มและแคช ระดับแรกประกอบด้วยส่วนพื้นฐานที่สุดของ DOM ในขณะที่ระดับที่สองจะเพิ่มการปรับปรุงที่หลากหลาย รวมถึงการเพิ่มการรองรับเนมสเปซและแผนภูมิแบบเรียงซ้อน (CSS)
XMLTextWriter------สร้างไฟล์ XML ที่สอดคล้องกับข้อกำหนด W3C XML 1.0
บทความนี้ส่วนใหญ่พูดถึง XMLTextReader ระดับเฟิร์สคลาส จุดประสงค์ของคลาสนี้คือเพื่ออ่านข้อมูลจากไฟล์ XML อย่างรวดเร็วโดยไม่ต้องวางความต้องการทรัพยากรระบบสูง (ส่วนใหญ่รวมถึงหน่วยความจำและเวลาตัวประมวลผล) ภายใต้การควบคุมของโปรแกรมหลัก มันจะใช้กระบวนการทำงานนี้โดยค่อยๆ ใช้งานไฟล์ XML โดยการประมวลผลเพียงโหนดเดียวในแต่ละครั้ง ในแต่ละโหนดของไฟล์ XML โปรแกรมหลักสามารถกำหนดประเภทของโหนด คุณลักษณะและข้อมูล (ถ้ามี) และข้อมูลอื่นๆ เกี่ยวกับโหนด จากข้อมูลนี้ โปรแกรมหลักสามารถเลือกได้ว่าจะประมวลผลโหนดนี้หรือละเว้นข้อมูลของโหนดเพื่อตอบสนองความต้องการของคำขอแอปพลิเคชันต่างๆ สิ่งนี้เรียกว่าแบบจำลองการประมวลผลแบบดึงเนื่องจากโปรแกรมหลักทำการร้องขอและแยกแต่ละโหนดออกจากไฟล์ XML จากนั้นจะประมวลผลหรือไม่ประมวลผลตามความจำเป็น
เราสามารถเปรียบเทียบคลาส XMLTextReader กับ XML Simple Application Programming Interface หรือ SAX ซึ่งเป็นอีกเทคโนโลยีหนึ่งในการอ่านข้อมูล XML ที่ได้รับความนิยมอย่างมากในหมู่โปรแกรมเมอร์ XMLTextReader และ SAX มีความคล้ายคลึงกันมากตรงที่สามารถอ่านข้อมูลจากไฟล์ XML ได้อย่างรวดเร็วโดยไม่ต้องใช้ทรัพยากรระบบมากนัก อย่างไรก็ตาม ไม่เหมือนกับโมเดลการแยกของ XMLTextReader ตรงที่ SAX ใช้โมเดลพุช: ตัวประมวลผล XML ใช้ "เหตุการณ์" เพื่อแจ้งแอปพลิเคชันโฮสต์ว่ามีข้อมูลโหนดใดบ้างและไม่สามารถรับได้ ตามความจำเป็น โปรแกรมโฮสต์จะตอบสนองตามการตอบสนองหรือเพิกเฉย . กล่าวอีกนัยหนึ่ง ข้อมูลจะถูกส่งจากตัวจัดการ SAX ไปยังโฮสต์ โปรแกรมเมอร์จะต้องถกเถียงกันว่าโมเดลการประมวลผลแบบ pull-out หรือ push-in มีข้อได้เปรียบมากกว่า แต่ก็ปฏิเสธไม่ได้ว่าทั้งสองรุ่นทำงานได้ดี .NET Framework ไม่รองรับ SAX แต่คุณสามารถใช้เครื่องมือ SAX ที่มีอยู่ เช่น ตัวแยกวิเคราะห์ MSXML กับแอปพลิเคชัน .NET ของคุณได้
คลาส XMLTextReader มีตัวสร้างเพื่อรองรับสถานการณ์ที่หลากหลาย เช่น การอ่านข้อมูลจากสตรีมข้อมูลที่มีอยู่ หรือ Uniform Resource Locator โดยทั่วไป คุณอาจต้องการอ่านข้อมูล XML จากไฟล์ และมีตัวสร้างที่เกี่ยวข้องเพื่อให้บริการนี้ นี่คือตัวอย่าง (ตัวอย่างโค้ดทั้งหมดของฉันเป็นภาษา C# ซึ่งแปลงได้ง่ายหากคุณต้องการใช้ VISUAL BASIC)
XMLTextReader myReader;
myReader = New XMLTextReader("c:datasales.XML")
สร้างลูปที่เรียกว่าเมธอด Read() ค่าที่ส่งคืนของเมธอดนี้จะเป็นจริงเสมอจนกว่าจะถึงด้านล่างสุดของไฟล์ เมื่อค่าที่ส่งคืนกลายเป็นเท็จ . กล่าวอีกนัยหนึ่ง การวนซ้ำเริ่มต้นที่จุดเริ่มต้นของไฟล์และอ่านในโหนดทั้งหมด ทีละโหนด จนกระทั่งถึงจุดสิ้นสุดของไฟล์:
While (myReader.Read()) {
-
// ประมวลผลแต่ละโหนดที่นี่
-
}
หลังจากการเรียก Read() สำเร็จแต่ละครั้ง โปรแกรมการสร้างอินสแตนซ์ XMLTextReader จะมีข้อมูลเกี่ยวกับโหนดปัจจุบัน (นั่นคือ โหนดที่เพิ่งอ่านจากไฟล์) เราสามารถรับข้อมูลข้างต้นจากสมาชิกของ XMLTextReader เช่นเดียวกับที่อธิบายไว้ในตารางที่ 1 และกำหนดประเภทของโหนดปัจจุบันผ่านแอตทริบิวต์ NodeType โค้ดโปรแกรมสามารถอ่านข้อมูลโหนด ตรวจสอบว่ามีแอตทริบิวต์หรือไม่ และจะละเว้นหรือดำเนินการและประมวลผลที่สอดคล้องกันตามความต้องการของโปรแกรมหรือไม่ โดยขึ้นอยู่กับประเภทของโหนด
เมื่อใช้แอตทริบิวต์ NodeType สิ่งสำคัญคือต้องเข้าใจว่าโหนดเกี่ยวข้องกับเซลล์ XML อย่างไร ตัวอย่างเช่น ดูองค์ประกอบ XML ต่อไปนี้:
<เมือง>ฉงชิ่ง</เมือง>
XMLtextReader ถือว่าองค์ประกอบนี้เป็น 3 โหนด ตามลำดับต่อไปนี้:
1. แท็ก <city> ถูกอ่านเป็นโหนดประเภท XMLNodeType.Element และสามารถรับชื่อขององค์ประกอบ "city" ได้จากแอตทริบิวต์ Name ของ XMLTextReader
2. ข้อมูลข้อความ "ฉงชิ่ง" ถูกอ่านเป็นโหนดประเภท XMLNodeType.Text ข้อมูล "ฉงชิ่ง" สามารถรับได้จากแอตทริบิวต์ Value ของ XMLTextReader
3. แท็ก </city> ถูกอ่านเป็นโหนดประเภท XMLNodeType.EndElement ในทำนองเดียวกัน ชื่อขององค์ประกอบ "เมือง" จะพร้อมใช้งานจากคุณสมบัติชื่อของ XMLTextReader
โหนดเหล่านี้เป็นประเภทที่สำคัญสามประเภท มีการอธิบายรายละเอียดไว้ในเอกสารประกอบ .NET โปรดดูข้อมูลที่เกี่ยวข้อง
ถ้า XMLTextReader พบข้อผิดพลาด เช่น การละเมิดไวยากรณ์ XML ก็จะแสดงข้อยกเว้นประเภท System.XML.XMLException รหัสที่ใช้คลาสนี้ควรได้รับการปกป้องเสมอ (ในบล็อก Try...Catch) ดังที่คุณจะเห็นในโปรแกรมสาธิตในภายหลัง
บทความนี้เป็นเพียงการแนะนำคลาส XMLTextReader ที่ค่อนข้างง่าย คลาส XMLTextReader มีสมาชิกจำนวนไม่มาก และเป็นไปไม่ได้ที่จะกล่าวถึงทั้งหมดที่นี่ XMLTextReader ให้ความยืดหยุ่นอย่างมากเมื่ออ่านข้อมูล XML ถึงกระนั้น ฉันก็ยังคงพูดคุยกันมากมายเพื่อให้แน่ใจว่าผู้อ่านสามารถเขียนโปรแกรมเพื่อให้บรรลุภารกิจที่มักจำเป็นในโลกแห่งความเป็นจริงได้ ซึ่งก็คือการอ่านข้อมูลจากไฟล์ XML แล้วส่งออกในรูปแบบ HTML เพื่อนำไปใช้ในเบราว์เซอร์ แสดง.
โปรแกรม ASP.NET (สคริปต์) นี้ทำงานบนเซิร์ฟเวอร์และสร้างหน้า HTML กลับไปยังเบราว์เซอร์ สคริปต์ได้รับใน Snippet 1 และไฟล์ข้อมูล XML ที่ใช้งานได้จะได้รับใน Snippet 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 = StringBuilder ใหม่ ();
พยายาม {
file:// สร้างอินสแตนซ์ของ XMLTextReader
xmlReader = XmlTextReader ใหม่ (XmlFileName);
// ประมวลผลไฟล์ XML
html.ผนวก(ProcessXml(xmlReader));
-
catch (เช่น XmlException){
html.Append("เกิดข้อยกเว้น XML: " +
เช่น ToString());
-
catch (ข้อยกเว้นเช่น) {
html.Append("มีข้อยกเว้นทั่วไปเกิดขึ้น: " +
เช่น ToString());
-
ในที่สุด
-
ถ้า (xmlReader != null)
xmlReader.ปิด();
-
กลับ html.ToString();
}
สตริงส่วนตัว ProcessXml (XmlTextReader xmlReader)
-
StringBuilder temp = new StringBuilder();
file://This method อ่านไฟล์ XML และสร้างเอกสาร HTML เอาท์พุต
ในขณะที่ (xmlReader.Read())
-
// จัดการจุดเริ่มต้นของโหนดองค์ประกอบ
ถ้า (xmlReader.NodeType == XmlNodeType.Element)
-
file://ignores <people> และ <person> องค์ประกอบ
ถ้า ((xmlReader.Name != "บุคคล") && (xmlReader.Name != "บุคคล"))
-
file://หากเป็นองค์ประกอบ <category> ให้เริ่มย่อหน้าใหม่
ถ้า (xmlReader.Name == "หมวดหมู่" )
temp.Append("<p><");
file://adds ชื่อองค์ประกอบในการส่งออก
temp.ผนวก( xmlReader.Name + ": " );
-
-
// ประมวลผลโหนดข้อความ
อย่างอื่นถ้า (xmlReader.NodeType == XmlNodeType.Text)
temp.ผนวก(xmlReader.Value + "<br>");
file:// จัดการจุดสิ้นสุดของโหนดองค์ประกอบ
อย่างอื่นถ้า (xmlReader.NodeType == XmlNodeType.EndElement)
-
หาก file:// เป็นโหนด <email> ให้เพิ่มแท็กเพื่อสิ้นสุดย่อหน้า
ถ้า (xmlReader.Name == "อีเมล" )
temp.Append("</p><");
-
}//สิ้นสุด while loop
return temp.ToString();
} file://End ProcessXML method
} file://End XmlDisplay class
private void Page_Load(Object sender, EventArgs e){
file://สร้างอินสแตนซ์ของคลาส XmlDisplay
XmlDisplay XmlDisplayDemo = XmlDisplay ใหม่();
output.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
-
</สคริปต์><
<html>
<หัว>
</หัว><
<ร่างกาย>
<h2>คลาสสาธิต XmlTextReader</h2>
<div id="output" runat="server"/>
</ตัว>
</html>
1 โมฆะคงที่หลัก (สตริง [] args)
2 {
3 วันที่และเวลา d1 =วันที่และเวลาตอนนี้;
4 XmlDocumentTest();
5 วันที่และเวลา d2 =วันที่และเวลาตอนนี้;
6 ช่วงเวลา ts =d2-d1;
7
8 Console.WriteLine (ts.TotalMilliseconds);
9 คอนโซล อ่าน();
10
11 }
12
13
14 สตริงสาธารณะ XmlFileName = "../../XML/1.xml";
15
16 โมฆะส่วนตัวคงที่ XmlTextReaderTest()
17 {
18 เครื่องอ่าน XmlTextReader = XmlTextReader ใหม่ (XmlFileName);
19 ในขณะที่ (reader.Read() )
20 {
21 ทางออกบูล =เท็จ;
22 สวิตช์ (เครื่องอ่าน NodeType)
ยี่สิบสาม {
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 =XmlDocument ใหม่();
49 xd.Load(XmlFileName);
50 โหนด XmlNode = xd.SelectSingleNode("/people/person[category='last']");
51 Console.Write (โหนดชื่อ);
52 }
ปรากฎว่าอันแรกใช้เวลานาน:
ปรากฎว่าอันที่สองใช้เวลานาน:
http://www.cnblogs.com/goody9807/archive/2006/10/24/534888.html