ホームページ >バックエンド開発 >XML/RSS チュートリアル >XML ファイルを読み取るための XMLTextReader と XmlDocument の比較
インターネットの記事を見て自分で試してみましたが、確かに xmlTextReader の方が速いです。
.NET Framework の System.XML 名前空間に含まれる XMLTextReader クラスは、高いシステム リソース要件を必要とせず、XML ファイルからデータをすばやく読み取ることができます。 XMLTextReader クラスを使用して、XML ファイルからデータを読み取り、ブラウザーで出力できるように HTML 形式に変換します。
この記事を読む前に、読者は XML、HTML、C# プログラミング言語、および .NET (特に asp.net フレームワーク) に関するいくつかの基本的な知識を理解しておく必要があります。
Microsoft の .NET フレームワークは、開発者に多くの便利な開発機能を提供します。XML の重要性が高まるにつれ、開発者は強力な XML ツールの完全なセットの開発を期待しています。 .NET フレームワークは私たちの期待に応え、システム内の XML データ用に次のクラスを編成しました。 (一方向とは、XML ファイルを前から後ろにのみ読み取ることができ、逆方向には読み取ることができないことを意味します)
XMLValidatingReader-----XMLTextReader クラスとともに使用すると、DTD、XDR、および XSD スキーマを検証する機能が提供されます。
XMLDocument------W3C Document Object Model 仕様の 1 次および 2 次標準に従って、XML データへのランダムなキャッシュされたアクセスを実現します。最初のレベルには DOM の最も基本的な部分が含まれており、2 番目のレベルには名前空間やカスケード ダイアグラム (CSS) のサポートの追加など、さまざまな改善が加えられています。
XMLTextWriter-----W3C XML 1.0仕様に準拠したXMLファイルを生成します。
この記事では、主にファースト クラスの XMLTextReader について説明します。このクラスの目的は、システム リソース (主にメモリとプロセッサ時間など) に大きな負荷をかけることなく、XML ファイルからデータを迅速に読み取ることです。親プログラムの制御下で、一度に 1 つのノードだけを処理して XML ファイルを段階的に操作することで、この作業プロセスを実装します。 XML ファイルの各ノードで、親プログラムはノードのタイプ、その属性とデータ (存在する場合)、およびノードに関するその他の情報を決定できます。この情報に基づいて、親プログラムはこのノードを処理するか、さまざまなアプリケーション要求のニーズを満たすためにノードの情報を無視するかを選択できます。これは、親プログラムがリクエストを作成し、XML ファイルから個々のノードを抽出し、必要に応じて処理したり、処理しなかったりするため、プル処理モデルと呼ばれます。
XMLTextReader クラスを XML Simple Application Programming Interface (SAX) と比較できます。SAX は、プログラマーの間で非常に人気のある XML データを読み取るためのもう 1 つのテクノロジです。 XMLTextReader と SAX は、多くのシステム リソースを消費せずに XML ファイルからデータを迅速に読み取ることができるという点で非常に似ています。ただし、XMLTextReader の抽出モデルとは異なり、SAX はプッシュ モデルを使用します。XML プロセッサは「イベント」を使用して、必要に応じてどのノード データが利用可能でどのデータが取得できないかをホスト アプリケーションに通知します。ホスト プログラムはそれに応じて応答するか、無視します。 。つまり、データは SAX ハンドラーからホストにプッシュされます。プログラマーは、プルアウト処理モデルとプッシュイン処理モデルのどちらに利点があるかについて議論することになりますが、どちらのモデルもうまく機能することは否定できません。 .NET Framework は SAX をサポートしていませんが、MSXML パーサーなどの既存の SAX ツールを .NET アプリケーションで使用できます。
XMLTextReaderクラスには、既存のデータストリームやUniform Resource Locatorからのデータの読み取りなど、さまざまな状況に適応するためのコンストラクターがいくつかあります。最も一般的には、ファイルから XML データを読み取りたい場合があり、これに対応するコンストラクターが存在します。以下に例を示します (私のコード例はすべて C# で書かれています。VISUAL BASIC を使用したい場合は、簡単に変換できます)。
XMLTextReader myReader; myReader = New XMLTextReader("c:\data\sales.XML")
Read()メソッドというループを作成します。このメソッドの戻り値はファイルの最後まで常にtrueになり、戻り値はfalseになります。つまり、ループはファイルの先頭から開始され、ファイルの末尾に到達するまで、すべてのノードを一度に 1 つずつ読み込みます。
While (myReader.Read()) { ... // 在这里处理每个节点. ... }
Read() の呼び出しが成功するたびに、XMLTextReader インスタンシエーターには次の内容が含まれます。現在のノード (つまり、ファイルから読み取ったばかりのノード) の情報。表 1 で説明したように、XMLTextReader のメンバーから上記の情報を取得し、NodeType 属性を通じて現在のノードのタイプを決定できます。ノード タイプに基づいて、プログラム コードはノード データを読み取り、属性があるかどうかを確認し、プログラムのニーズに応じてそれを無視するか、対応する操作と処理を実行するかを確認できます。
NodeType 属性を使用する場合、ノードが XML ユニットにどのように関連しているかを理解することが非常に重要です。たとえば、次の XML 要素を見てみましょう:
<city>Chongqing</city>
XMLtextReader は、この要素を次の順序で 3 つのノードとして扱います:
1.
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>
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 }
以上就是XMLTextReader和XmlDocument读取XML文件的比较的内容,更多相关内容请关注PHP中文网(www.php.cn)!