XmlDocument
大きな XML ドキュメントを読み込もうとしていますが、ファイル全体をメモリに読み込む方法と比較して、チャンクで読みたかったのです。これを行うために使用できることはわかっXmlTextReader
ていますが、SAX for .NET を使用したことがある人はいますか? 私は Java 開発者がそれを信頼していることを知っており、試してみる価値があるかどうか、もしそうなら、それを使用する利点は何かと考えていました。詳細を探しています。
4 に答える
ジョブをすばやく完了したいだけの場合は、その目的のために XmlTextReader が (.NET に) 存在します。
安定していて、非常に効率的かつエレガントにコーディングする必要があり、非常に柔軟でもある事実上の標準 (および他の多くのプログラミング言語で利用可能) を学びたい場合は、SAX を検討してください。ただし、非常に難解な XML パーサーを作成する場合を除き、時間を無駄にしないでください。代わりに、特定のプラットフォーム用の次世代パーサー (XmlTextReader など) を探してください。
SAX リソースSAX はもともと Java 用に作成されたもので、数年間安定している元のオープン ソース プロジェクトを http://sax.sourceforge.net/
で見つけることができます。
ここには、同じプロジェクトの C# ポートがあります (ソース ダウンロードの一部として HTML ドキュメントが含まれています)。また、安定しています: http://saxdotnet.sourceforge.net/
C# の実装が気に入らない場合は、MSXML3 以降を使用して COMInterop 経由で COM DLL を参照する方法をいつでも利用できます: http://msdn.microsoft.com/en-us/library/ms994343.aspx
Java の世界からの記事ですが、このアプローチで成功するために必要な概念をおそらく説明しています (ダウンロード可能な Java ソース コードもあり、有用であり、C# に簡単に変換できる可能性があります)。
- 大きな XML 文書の出力、パート 1 ( http://www.ibm.com/developerworks/xml/library/x-tipbigdoc.html )
- 大きな XML 文書の出力、パート 2 ( http://www.ibm.com/developerworks/xml/library/x-tipbigdoc2.html )
- SAX フィルターを使用してデータを操作する ( http://www.ibm.com/developerworks/xml/library/x-tipsaxfilter/ )
面倒な実装になります。私は .NET 以前の時代にしか SAX を使用していませんでしたが、かなり高度なコーディング技術が必要です。この時点で、面倒なことをするだけの価値はありません。
ハイブリッド パーサーの興味深い概念
このスレッドでは、.NET XmlTextReader を使用して DOM と SAX の利点を組み合わせたパーサーを実装するハイブリッド パーサーについて説明しています...
http://bytes.com/groups/net-xml/178403- xmltextreader 対 dom
SAX for .NETについて話している場合、プロジェクトは維持されていないようです。最後のリリースは 2 年以上前です。前回のリリースでは完璧だったのかもしれませんが、私はそうは思いません。作者のKarl Waclawekはネットから姿を消したようです。
Java での SAX については? きっと、それは素晴らしいことです。残念ながら、SAX が標準として開発されたことは一度もないため、Java 以外のポートはすべて、独自のニーズに合わせて Java API を採用しています。DOM はかなりお粗末な API ですが、複数の言語と環境用に設計されているという利点があるため、Java、C#、JavaScript、C などで簡単に実装できます。
少なくとも次の 2 つの理由から、SAX を使用するメリットはないと思います。
- SAX は「プッシュ」モデルですが、XmlReader は多くの利点を持つプル パーサーです。
- 標準の .NET API を使用するのではなく、サードパーティのライブラリに依存している。
個人的には、XmlReader にはコードにバグを引き起こし、コードが要素をスキップする可能性がある非常に厄介なトラップがいくつかあるため、SAX モデルの方がずっと好きです。ほとんどのコードは while(rdr.Read()) モデルを中心に構成されますが、そのループ内に "ReadString" または "ReadInnerXml()" がある場合、次の繰り返しで要素をスキップしていることに気付くでしょう。
SAX はイベント ベースであるため、パーサーのシークアヘッドを引き起こす操作を実行できないため、これは決して起こりません。
私の個人的な感覚では、Microsoft は、プッシュ/プル モデルの説明により、XmlReader の方が優れているという概念を発明しましたが、私はそれをあまり支持しません。したがって、Microsoft は、XmlReader を使用してステート マシンを作成する必要はないと考えています。それは私には意味がありませんが、とにかく、それは私の意見です。