XMLを再帰的に調査するための推奨される方法は何ですか?
XMLReader
// XMLDocument
/XMLTextReader
その他のオプション?
XMLを読み取る方法がたくさんあるのはなぜか少し混乱しています。
重要な注意:Stream
Xml読み取りオブジェクトが特定の参照オブジェクトからそれ自体を作成できるはずであるという制約があります。
XMLを再帰的に調査するための推奨される方法は何ですか?
XMLReader
// XMLDocument
/XMLTextReader
その他のオプション?
XMLを読み取る方法がたくさんあるのはなぜか少し混乱しています。
重要な注意:Stream
Xml読み取りオブジェクトが特定の参照オブジェクトからそれ自体を作成できるはずであるという制約があります。
と の両方がドキュメントのランダム アクセスXDocument
をXmlDocument
サポートするため、ノード階層の双方向トラバースがサポートされます。したがって、これらのいずれかが再帰的な方法として適しています。
XDocument
XmlDocument
XPath を使用してドキュメントをクエリする場合はより便利ですが、LINQ を使用するように設計されています。それは本当に好みの問題であり、その時に必要なものです。どちらも同じように有効なオプションであり、非常によく似た機能を提供します。
XMLTextReader
ドキュメント グラフ全体を検証せずに、ストリームから一度に 1 つのノードを読み取るだけなので、より効率的です。ただし、これは順方向専用であるため、ノード ツリーを遡って親ノードに戻ることはできません。したがって、実行している内容には適していない可能性があります。
XMLReader
はXMLTextReader
(とりわけ) の抽象基本クラスであるため、直接使用することはできません。
アップデート
上記のコメントで、実際にやろうとしているのはすべてのリーフ要素を見つけることだと述べたので、再帰を使用する必要はまったくありません。LINQ または XPath を利用して、すべての作業を行うことができます。LINQ を使用したくないと言ったので、XPath を使用してそれを行う方法は次のXmlDocument
とおりです。
XmlNodeList leafElements = doc.SelectNodes("//*[not(node())]");
またはXDocument
:
IEnumerable<XElement> leafElements = doc.XPathSelectNodes("//*[not(node())]");
私自身、常にXDocumentに傾倒してきました。XDocument.Load(Stream) (またはそのオーバーロードの 1 つ)を使用して、ストリームからデータを読み込むことができます。