Vergleich von XMLTextReader und XmlDocument zum Lesen von XML-Dateien

黄舟
Freigeben: 2017-02-28 16:29:56
Original
1756 Leute haben es durchsucht

Ich habe einen Artikel im Internet gesehen und es selbst ausprobiert. Tatsächlich ist xmlTextReader schneller!

Die im System.XML-Namespace des .NET Framework enthaltene Klasse XMLTextReader kann schnell Daten aus XML-Dateien lesen, ohne dass hohe Systemressourcen erforderlich sind. Verwenden Sie die Klasse XMLTextReader, um Daten aus XML-Dateien zu lesen und sie zur Ausgabe im Browser in das HTML-Format zu konvertieren.

Bevor Sie diesen Artikel lesen, müssen die Leser einige Grundkenntnisse verstehen: XML, HTML, C#-Programmiersprache und einige Kenntnisse von .NET, insbesondere dem asp.net-Framework.

Das .NET-Framework von Microsoft bietet Entwicklern viele Entwicklungsvorteile. Da die Bedeutung von XML weiter zunimmt, freuen sich Entwickler auf die Entwicklung eines vollständigen Satzes leistungsstarker XML-Tools. Das .NET-Framework hat unsere Erwartungen erfüllt und die folgenden Klassen für XML im System.XML-Namespace organisiert:

XMLTextReader------bietet schnellen, unidirektionalen, ungepufferten Zugriff auf XML-Daten Benehmen. (Einseitig bedeutet, dass Sie die XML-Datei nur von vorne nach hinten lesen können, nicht jedoch umgekehrt)

XMLValidatingReader------Wird mit der XMLTextReader-Klasse verwendet und ermöglicht die Validierung von DTD, XDR und XSD Schemata-Fähigkeit.

XMLDocument------folgt den primären und sekundären Standards der W3C Document Object Model-Spezifikation, um einen zufälligen und zwischengespeicherten Zugriff auf XML-Daten zu erreichen. Die erste Ebene enthält die grundlegendsten Teile des DOM, während die zweite Ebene eine Reihe von Verbesserungen hinzufügt, darunter zusätzliche Unterstützung für Namespaces und Cascading Diagrams (CSS).

XMLTextWriter------Generieren Sie XML-Dateien, die der W3C XML 1.0-Spezifikation entsprechen.

In diesem Artikel geht es hauptsächlich um die erste Klasse XMLTextReader. Der Zweck dieser Klasse besteht darin, schnell Daten aus XML-Dateien zu lesen, ohne dass hohe Systemressourcen erforderlich sind (hauptsächlich Speicher- und Prozessorzeit). Unter der Kontrolle des übergeordneten Programms implementiert es diesen Arbeitsprozess, indem es die XML-Datei schrittweise bearbeitet und jeweils nur einen Knoten verarbeitet. In jedem Knoten der XML-Datei kann das übergeordnete Programm den Typ des Knotens, seine Attribute und Daten (falls vorhanden) sowie andere Informationen über den Knoten bestimmen. Basierend auf diesen Informationen kann das übergeordnete Programm entscheiden, ob es diesen Knoten verarbeiten oder die Informationen des Knotens ignorieren möchte, um den Anforderungen verschiedener Anwendungsanforderungen gerecht zu werden. Dies wird als Pull-Verarbeitungsmodell bezeichnet, da das übergeordnete Programm die Anforderung stellt, die einzelnen Knoten aus der XML-Datei extrahiert und sie dann je nach Bedarf verarbeitet oder nicht verarbeitet.
Wir können die XMLTextReader-Klasse mit dem XML Simple Application Programming Interface (SAX) vergleichen, einer weiteren Technologie zum Lesen von XML-Daten, die bei Programmierern sehr beliebt ist. XMLTextReader und SAX sind sich insofern sehr ähnlich, als sie schnell Daten aus XML-Dateien lesen können, ohne viele Systemressourcen zu beanspruchen. Im Gegensatz zum Extraktionsmodell von XMLTextReader verwendet SAX jedoch ein Push-Modell: Der XML-Prozessor informiert die Host-Anwendung mithilfe von „Ereignissen“, welche Knotendaten verfügbar sind und welche nicht nach Bedarf abgerufen werden können. Das Host-Programm reagiert entsprechend oder ignoriert sie . Mit anderen Worten: Die Daten werden vom SAX-Handler an den Host übertragen. Programmierer werden sicherlich darüber diskutieren, ob die Pull-out- oder Push-in-Verarbeitungsmodelle mehr Vorteile bieten, aber es lässt sich nicht leugnen, dass beide Modelle gut funktionieren. Das .NET Framework unterstützt SAX nicht, Sie können jedoch vorhandene SAX-Tools wie den MSXML-Parser mit Ihren .NET-Anwendungen verwenden.

Die XMLTextReader-Klasse verfügt über Konstruktoren, um eine Vielzahl von Situationen zu berücksichtigen, z. B. das Lesen von Daten aus einem vorhandenen Datenstrom oder einem Uniform Resource Locator. Am häufigsten möchten Sie möglicherweise XML-Daten aus einer Datei lesen, und es gibt einen entsprechenden Konstruktor, der dies unterstützt. Hier ist ein Beispiel (alle meine Codebeispiele sind in C# und können leicht konvertiert werden, wenn Sie VISUAL BASIC bevorzugen).

XMLTextReader myReader;
myReader = New XMLTextReader("c:\data\sales.XML")
Nach dem Login kopieren

Erstellen Sie eine Schleife namens Read()-Methode. Der Rückgabewert dieser Methode ist immer wahr, bis das Ende der Datei erreicht ist. Dann wird der Rückgabewert falsch. Mit anderen Worten, die Schleife beginnt am Anfang der Datei und liest nacheinander alle Knoten ein, bis sie das Ende der Datei erreicht:

While (myReader.Read()) {
...
// 在这里处理每个节点.
...
}
Nach dem Login kopieren

Nach jedem erfolgreichen Aufruf von Read() , die XMLTextReader-Instanz Der Optimierer enthält Informationen über den aktuellen Knoten (d. h. den Knoten, der gerade aus der Datei gelesen wurde). Wir können die oben genannten Informationen von den Mitgliedern von XMLTextReader erhalten, wie in Tabelle 1 beschrieben, und den Typ des aktuellen Knotens über das NodeType-Attribut bestimmen. Basierend auf dem Knotentyp kann der Programmcode die Knotendaten lesen, prüfen, ob sie Attribute haben und ob sie ignoriert werden sollen oder entsprechende Vorgänge und Verarbeitungen entsprechend den Anforderungen des Programms durchführen sollen.

Bei der Verwendung des NodeType-Attributs ist es wichtig zu verstehen, wie Knoten mit XML-Einheiten zusammenhängen. Sehen Sie sich beispielsweise das folgende XML-Element an:

<city>Chongqing</city>
Nach dem Login kopieren

XMLtextReader behandelt dieses Element als 3 Knoten in der folgenden Reihenfolge:

1. Das -Tag wird als Knoten vom Typ XMLNodeType.Element gelesen und der Name des Elements „city“ kann aus dem Name-Attribut von XMLTextReader abgerufen werden.

  2.文本数据“Chongqing”被读为类型为XMLNodeType.Text的节点。数据“Chongqing ” 可从XMLTextReader 的Value属性中取得。

  3.</city>标签被读为类型为XMLNodeType.EndElement 节点。同样,元素的名称“city”可从XMLTextReader的Name属性中获得。

  这是 3 种重要的节点类型,其它的类型在.NET的说明文档中有详细说明,请大家参阅相关资料。

  如果XMLTextReader遇到一个错误, 例如出现违反XML句法的情况,它抛出一个System.XML.XMLException类型的异常。使用这个类的代码应该总是被保护 ( 在Try……Catch块中),就像你以后在演示程序中看到的一样。
  本文只是一篇相当简单的介绍XMLTextReader 类的文章,XMLTextReader类有相当多的成员,在这里不可能一一述及。当读入XML数据时,XMLTextReader能提供相当强的灵活性。即便如此,我仍然进行了大量的论述,以保证读者能编制程序来实现现实世界中经常要求完成的任务,也就是从一个XML文件读取数据然后以HTML的格式输出,从而实现在浏览器中的显示。

  这个ASP.NET程序(脚本)在服务器上运行并产生一个HTML页面返回浏览器。这段脚本程序在代码段 1 给出,它用来工作使用的 XML 数据文件在代码段 2给出。你能看到这个 XML 文件包含一份表示联系关系的列表;程序的目标即是将这个列表显示出来,为了更容易我们观察,这些列表已经被格式化了。

  运行程序:

  1. 将代码段1存为XMLTextReader.ASPx文件,将代码段2存为XMLData.XML文件。

  2. 把这两个文件都放在一个已经安装好.NET 框架的网络服务器的虚拟文件夹中。

  3. 打开 Internet Explorer 并且浏览这个ASPx文件,例如,在一个局域网服务器上, URL 将是 http://localhost/xmltextreader.ASPx ;。

  程序工作的大部分都由XMLDisplay 类来做,尤其是被PRocessXML()方法完成的。它每次读取一个节点XML数据,对于感兴趣的元素,节点数据和后跟冒号的节点名将和相应的HTML格式化标签一起写入输出结果中。在这阶段,“输出结果”由一个HTML文本暂时储存在其中的StringBuilder对象构成。

  ProcessXML()方法是从LoadDocument()方法调用的。这个方法执行的任务是产生一个XMLTextReader实例化程序并在调用ProcessXML之前装载XML文件。它同时也处理异常,随后产生错误的信息并在浏览器中显示出来。最终该方法返回一个字符串,这个字符串或者包含产生的HTML内容,或者如果异常发生的话就包含出错信息,。

  程序执行以Page_Load()程序开始,当浏览器请求浏览这个页面时,这一步会自动执行。这里的代码实例化了XMLDisplay 类并调用它的LoadDocument()方法。如果一切运行正常的话,格式化的HTML形式的返回值将被拷贝到页面的一个<div>标签中,生成的HTML文档被送回到浏览器中并显示出来。

  其他的.NET 框架的类,比如XMLDocument类在读取XML数据方面表现如何呢?XMLDocument 类与XMLTextReader 类不同,它在存储器中创建整个XML文档的节点树。这样就可以随机的获得XML数据(与XMLTextReader 类获得数据的线性方式正好相反),并且在修改XML文件的数据和结构时,具有非常完美的灵活性。另外,XMLDocument允许执行XSLT 转变,不过,这些额外的功能是以运行速度的降低和系统资源的更多占用为代价的。
  代码段1:XmlTextReader.aspx

<%@ Import Namespace="System.Xml" %>
<script language="C#" runat=server>
public class XmlDisplayfile://这个类读入并处理XML文件。{
public string LoadDocument(String XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = new StringBuilder();
try {
file://创建XMLTextReader的实例。xmlReader = new XmlTextReader(XmlFileName);
// 处理XML文件html.Append(ProcessXml(xmlReader));
}
catch (XmlException ex){
html.Append("发生一个XML异常:" + ex.ToString());} 
catch (Exception ex){html.Append("发生一个普通异常:" + ex.ToString());} 
finally {if (xmlReader != null)xmlReader.Close();}return html.ToString();}
private string ProcessXml(XmlTextReader xmlReader) 
{StringBuilder temp = new StringBuilder();
file://这个方法读入XML文件并生成输出的HTML文档。
while ( xmlReader.Read() ) {
// 处理一个元素节点的起始。
if (xmlReader.NodeType == XmlNodeType.Element) { 
file://忽略<people>和<person>元素if ((xmlReader.Name != "person") && (xmlReader.Name != "people")) 
{file://如果是一个<category>元素,开始一个新的段落if ( xmlReader.Name == "category" )temp.Append("<p>");
file://添加元素名到输出中temp.Append( xmlReader.Name + ": " );}}
// 处理文本节点
else if (xmlReader.NodeType == XmlNodeType.Text) 
temp.Append(xmlReader.Value + "<br>");
file://处理元素节点的结尾else if (xmlReader.NodeType == XmlNodeType.EndElement) {
file://如果是<email>节点,添加结束段落的标记if ( xmlReader.Name == "email" ) temp.Append("</p>"); } }
//结束while循环
return temp.ToString();
} file://结束ProcessXML方法
} file://结束XmlDisplay类
private void Page_Load(Object sender, EventArgs e){
file://创建XmlDisplay类的实例XmlDisplay XmlDisplayDemo = new XmlDisplay();
output.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
}</script><html><head></head><body><h2>演示XmlTextReader类</h2>
<div id="output" runat="server"/></body></html>
Nach dem Login kopieren

 1    static void Main(string[] args)
 2        {
 3            DateTime d1 =DateTime.Now;
 4            XmlDocumentTest();
 5            DateTime d2 =DateTime.Now;
 6            TimeSpan ts =d2-d1 ;
 7            
 8            Console.WriteLine(ts.TotalMilliseconds) ;    
 9            Console.Read() ;
10
11        }
12
13
14        public static string XmlFileName = "../../XML/1.xml";
15        
16        private static void XmlTextReaderTest()
17        {
18            XmlTextReader reader = new XmlTextReader(XmlFileName);
19            while (reader.Read() )
20            {
21                bool exit =false;
22                switch(reader.NodeType)
23                {
24                    case XmlNodeType.Element :
25                        break;
26                    case XmlNodeType.Text :
27                        if (reader.Value=="last")
28                        {
29                            exit=true;
30                        }
31                        break;
32                    case XmlNodeType.EndElement  :
33                        break;
34                    default:
35                        break;
36                }
37                if(exit)
38                {
39                    return;
40                    
41                }
42
43            }
44        }
45
46        private static void XmlDocumentTest()
47        {
48            XmlDocument xd =new XmlDocument() ;
49            xd.Load(XmlFileName) ;
50            XmlNode node = xd.SelectSingleNode("/people/person[category='last']"); 
51            Console.Write(node.Name) ; 
52        }
Nach dem Login kopieren

以上就是XMLTextReader和XmlDocument读取XML文件的比较的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!