次の2つの方法の両方を使用してXMLを解析しました...
- オブジェクト モデルと XPath クエリを使用して XmlDocument を解析します。
- XSL/T
でも使ったことない…
- .Net 3.5 の新機能である Linq Xml オブジェクト モデル
3 つの選択肢の比較効率を誰か教えてもらえますか?
特定の使用法が要因になることは承知していますが、大まかなアイデアが欲しいだけです。たとえば、Linq オプションは他のオプションよりも大幅に遅いですか?
XML ドキュメントをクエリする絶対最速の方法は、最も難しいものです。XmlReader を使用して入力ストリームを処理するメソッドを作成し、ノードを読み取りながら処理するようにします。これは、解析とクエリを 1 つの操作に組み合わせる方法です。(単純に XPath を使用しても、これは実行されません。XmlDocument と XPathDocument の両方が Load メソッドでドキュメントを解析します。) これは通常、XML データの非常に大きなストリームを処理している場合にのみ有効です。
あなたが説明した3つの方法はすべて同様に機能します。XSLT には、XPath の非効率性とテンプレート マッチングの非効率性を組み合わせることができるため、最も遅くなる余地がたくさんあります。XPath クエリと LINQ クエリはどちらも本質的に同じことを行います。つまり、XML ノードの列挙可能なリストを線形検索します。LINQ はコンパイル時に解釈されますが、XPath は実行時に解釈されるため、LINQ は実際にはわずかに高速であると予想されます。
しかし一般的に、クエリの書き方は、使用するテクノロジーよりも実行速度に大きな影響を与えます。
XML ドキュメントに対して高速なクエリを作成する方法は、XPath を使用する場合でも LINQ を使用する場合でも同じです。実行中にアクセスするノードができるだけ少なくなるようにクエリを作成します。どのテクノロジを使用するかは問題ではありません。ドキュメント内のすべてのノードを調べるクエリは、それらの小さなサブセットのみを調べるクエリよりも実行速度が大幅に遅くなります。それができるかどうかは、何よりも XML の構造に依存しています。一般に、要素の階層がナビゲート可能なドキュメントは、すべての要素がドキュメント要素の子であるドキュメントよりもクエリがはるかに高速になります。
編集:
XML をクエリするための絶対的に最速の方法が最も難しいというのは私が正しいと確信していますが、実際に最速 (かつ最も困難) な方法はXmlReader
;を使用しません。ストリームからの文字を直接処理するステート マシンを使用します。XML を正規表現で構文解析するのと同様に、これは通常、ひどい考えです。ただし、速度のために機能を交換するオプションが提供されます。アプリケーションに不要な XML の部分 (名前空間の解決、文字エンティティの展開など) を処理しないことを決定することで、文字のストリームを通常よりも高速にシークするものを構築できますXmlReader
。これが悪いアイデアではないアプリケーションを思いつくことはできますが、多くは考えられません。
LinqToXml クエリは IEnumerable コントラクトに対して機能します。ほとんどの操作は O(N) です。これは、IEnumerable を反復処理する必要があるためです。
開始しているのが xml を含む文字列である場合、Linq でそれを操作するには、XElement.Parseを使用して完全なオブジェクト グラフに解析し、その一部を反復処理する必要があります (フィルタリングするために、例)。
XPath についての私の理解では、解析中にフィルター処理が行われるため、パフォーマンスの観点から非常に有利になる可能性があります。完全なオブジェクト グラフを構築する必要はありません。
実際にテストしたことはありませんが、Linq は主にコンパイラ コード生成型の機能であるため、XmlDocument および XPath クエリを使用する場合と同等であるはずです。
Linq の主な価値は、XPath も XSLT も提供できない、クエリ ステートメントのコンパイル時の検証を提供することです。
パフォーマンスが懸念される場合は、目の前のタスクに基づいて決定すると思います。たとえば、XML ドキュメントから単一の値を取得するには、単一の XPath クエリを使用するのが最も高速かもしれませんが、XML データを HTML ページに変換するには、XSLT を使用する方が高速です。
非常に高速な XML 処理 (読み取り) が必要な場合は、残念ながら XmlReader の使用を検討する必要があります。実装は少し難しいです。
XmlReader を組み合わせて LINQ ソリューションを実装する方法もあるため、LINQ を簡単に使用できます。また、XmlDocument/XPath よりもはるかに優れたパフォーマンスを得ることができます。
詳細については、次のリンクを参照してください。 http://blogs.msdn.com/xmlteam/archive/2007/03/24/streaming-with-linq-to-xml-part-2.aspx
また、XmlDocument/XPath を使用して小さな XML ファイルのみを操作する場合は、パフォーマンスの問題にはならないと思います。