効率的に読み取る必要がある大きな Xml ファイルがあります。一度にすべてを記憶することはできません。ただし、限られた量のアウトオブオーダー処理も行う必要があるため、1 回だけ連続して読み取ることはできません。XmlReader
で新しいを作成XmlReader.ReadSubTree()
し、元のリーダーで次の兄弟要素にスキップし、解析を続け、後で戻って新しいリーダーを使用してサブツリーを読み取ることができることを願っていました。
ただし、これは機能していないようです。作成した新しいものはXmlReaders
すべて同じ基本ストリームを使用しているように見えるため、1 つを進めるとすべてが進みます。
ただし、リーダーの基礎となるストリームが (ファイルストリームのように) シークをサポートしている場合、これは可能です。
私は Xml を 2 回連続して解析することに満足しています (これを回避する方法はありません) n
。
概念的に:
- Parse1: 完全な Xml を解析します。何も出力しませんが、
n
必要な (交差していない) サブツリーの開始オフセットと終了オフセットを決定します。 - Parse2: 各サブツリーを読み取りますが、それらが読み取られる順序はドキュメント順ではありません。
- ParseSub(1): サブツリー番号をシークしてから読み取る
x_1
- ...
- ParseSub(n): シークしてサブツリー番号を読み取る
x_n
- ParseSub(1): サブツリー番号をシークしてから読み取る
(既知のファイル オフセットまで) シークできる場合、Parse2 は全体として、Parse1 よりも Xml の読み取りを必要としないため、ファイル全体を 2 回読み取ることになります。シークできない場合は、ファイル全体を順番に読んでいると思いますn/2
。