インターネットの記事を見て自分で試してみると、案の定、XMLTextReader のほうが速いです。
.NET Framework の System.XML 名前空間に含まれる XMLTextReader クラスは、システム リソースをあまり要求せずに、XML ファイルからデータを迅速に読み取ることができます。 XMLTextReader クラスを使用して、XML ファイルからデータを読み取り、ブラウザーで出力できるように HTML 形式に変換します。
この記事を読む前に、読者は XML、HTML、C# プログラミング言語、および .NET (特に ASP.NET フレームワーク) に関するいくつかの基本的な知識を理解しておく必要があります。
Microsoft の .NET フレームワークは、開発者に多くの便利な開発機能を提供します。XML の重要性が高まるにつれ、開発者は強力な XML ツールの完全なセットの開発を期待しています。 .NET フレームワークは私たちの期待に応え、System.XML 名前空間に XML 用の次のクラスを編成しました。
XMLTextReader-----高速で一方向のバッファなしの 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 クラスには、既存のデータ ストリームやユニフォーム リソース ロケーターからのデータの読み取りなど、さまざまな状況に対応するコンストラクターがあります。最も一般的には、ファイルから XML データを読み取りたい場合があり、これに対応するコンストラクターが存在します。以下に例を示します (私のコード例はすべて C# で書かれています。VISUAL BASIC を使用したい場合は、簡単に変換できます)。
XMLTextReader myReader;
myReader = New XMLTextReader("c:datasales.XML") は、
Read() メソッドと呼ばれるループを作成します。このメソッドの戻り値は、ファイルの最後に到達するまで常に true になり、戻り値は false になります。 。つまり、ループはファイルの先頭から開始され、ファイルの末尾に到達するまですべてのノードを一度に 1 つずつ読み取ります
。
...
// ここで各ノードを処理します。
...
、
XMLTextReader インスタンス化プログラムには現在のノード (つまり、ファイルから読み取られたばかりのノード) に関する情報が含まれます。表 1 で説明したように、XMLTextReader のメンバーから上記の情報を取得し、NodeType 属性を通じて現在のノードのタイプを決定できます。ノード タイプに基づいて、プログラム コードはノード データを読み取り、属性があるかどうかを確認し、プログラムのニーズに応じてノード データを無視するか、対応する操作や処理を実行するかを確認できます。
NodeType 属性を使用する場合は、ノードが XML セルにどのように関連しているかを理解することが重要です。たとえば、次の XML 要素を見てみましょう:
<city>Chongqing</city>
XMLtextReader は、この要素を次の順序の 3 つのノードとみなします
。 <city> タグは XMLNodeType.Element 型のノードとして読み取られ、要素「city」の名前は XMLTextReader の Name 属性から取得できます。
2.テキスト データ「重慶」は、XMLNodeType.Text 型のノードとして読み込まれます。データ「重慶」はXMLTextReaderのValue属性から取得できます。
3. </city> タグは、XMLNodeType.EndElement タイプのノードとして読み取られます。同様に、要素「city」の名前は XMLTextReader の Name プロパティから取得できます。
これらは 3 つの重要なノード タイプです。他のタイプについては、.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 がインストールされている Web サーバー上の仮想フォルダーに配置します。
3. Internet Explorer を開き、ASPx ファイルを参照します。たとえば、LAN サーバー上の URL はhttp://localhost/xmltextreader.ASPxになります。
プログラムの作業のほとんどは、XMLDisplay クラス、特に ProcessXML() メソッドによって実行されます。対象の要素について、一度に 1 つのノード XML データを読み取り、ノード データとその後にコロンが続くノード名が、対応する HTML フォーマット タグとともに出力結果に書き込まれます。この段階の「出力結果」は、HTML テキストが一時的に格納される StringBuilder オブジェクトで構成されます。
ProcessXML() メソッドは、LoadDocument() メソッドから呼び出されます。このメソッドによって実行されるタスクは、XMLTextReader インスタンス化プログラムを生成し、ProcessXML を呼び出す前に XML ファイルをロードすることです。また、例外を処理し、その後エラー メッセージを生成してブラウザに表示します。最終的に、メソッドは、生成された HTML コンテンツを含む文字列、または例外が発生した場合はエラー メッセージを返します。
プログラムの実行は Page_Load() プログラムから始まり、ブラウザがこのページの閲覧を要求すると、このステップが自動的に実行されます。ここのコードは XMLDisplay クラスをインスタンス化し、その LoadDocument() メソッドを呼び出します。すべてが正常に実行されると、書式設定された HTML 戻り値がページの <div> タグにコピーされ、生成された HTML ドキュメントがブラウザに送り返されて表示されます。
XMLDocument クラスなどの他の .NET Framework クラスは、XML データの読み取り時にどのように動作しますか? XMLDocument クラスは、XML ドキュメント全体のノード ツリーをメモリ内に作成するという点で XMLTextReader クラスとは異なります。この方法では、XML データをランダムに取得でき (XMLTextReader クラスがデータを取得する直線的な方法とはまったく逆です)、XML ファイルのデータと構造を変更する際に完全な柔軟性が得られます。さらに、XMLDocument を使用すると XSLT 変換を実行できますが、これらの追加機能を使用すると、実行速度が遅くなり、システム リソースの使用量が増加します。
コード スニペット 1: XmlTextReader.aspx
<%@ Import Namespace="System.Xml" %>
<script language="C#" runat=server>
public class XmlDisplay
file://このクラスは XML ファイルを読み取り、処理します。
{
パブリック文字列 LoadDocument(String XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = 新しい StringBuilder();
試す {
file:// は XMLTextReader のインスタンスを作成します。
xmlReader = 新しい XmlTextReader(XmlFileName);
// XML ファイルを処理します
html.Append(ProcessXml(xmlReader));
}
catch (XmlException ex){
html.Append("XML 例外が発生しました: " +
ex.ToString());
}
catch (例外例){
html.Append("一般的な例外が発生しました: " +
ex.ToString());
}
ついに
{
if (xmlReader != null)
xmlReader.Close();
}
戻りhtml.ToString();
プライベート
文字列 ProcessXml(XmlTextReader xmlReader)
{
StringBuilder temp = new StringBuilder();
file://このメソッドは、XML ファイルを読み取り、出力 HTML ドキュメントを生成します。
while (xmlReader.Read())
{
// 要素ノードの開始を処理します。
if (xmlReader.NodeType == XmlNodeType.Element)
{
file://は <people> 要素と <person> 要素を無視します
if ((xmlReader.Name != "人") && (xmlReader.Name != "人"))
{
file://<category> 要素の場合は、新しい段落を開始します
if (xmlReader.Name == "カテゴリ" )
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 == "電子メール" )
temp.Append("</p>");
}
}//while ループを終了
return temp.ToString();
} file://End ProcessXML メソッド
} file://End XmlDisplay class
private void Page_Load(Object sender, EventArgs e){
file://XmlDisplay クラスのインスタンスを作成します。
XmlDisplay XmlDisplayDemo = new XmlDisplay();
Output.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
}
</スクリプト>
<html>
<頭>
</頭>
<本文>
<h2>XmlTextReaderクラスのデモ</h2>
<div id="output" runat="server"/>
</本文>
</html>
1 static void Main(string[] args)
2 {
3 日時 d1 = 日時.Now;
4 XmlDocumentTest();
5 日時 d2 = 日時.Now;
6 タイムスパン 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 プライベート静的 void XmlTextReaderTest()
17 {
18 XmlTextReader リーダー = new XmlTextReader(XmlFileName);
19 while (reader.Read() )
20 {
21 ブール終了 =false;
22 スイッチ(reader.NodeType)
23 {
24 の場合 XmlNodeType.Element:
25 休憩。
26 ケース XmlNodeType.Text:
27 if (reader.Value=="last")
28 {
29 終了 = true;
30}
31 休憩。
32 ケース XmlNodeType.EndElement:
33 休憩。
34 デフォルト:
35休憩。
36}
37 if(出口)
38 {
39 戻ります。
40
41 }
42
43}
44}
45
46 プライベート静的 void XmlDocumentTest()
47 {
48 XmlDocument xd =new XmlDocument();
49 xd.Load(Xmlファイル名);
50 XmlNode ノード = xd.SelectSingleNode("/people/person[category='last']");
51 Console.Write(node.Name);
52 }
最初の処理には長い時間がかかることがわかりました。
2 番目の方法は時間がかかることがわかりました:
http://www.cnblogs.com/goody9807/archive/2006/10/24/534888.html