0

効率的に読み取る必要がある大きな Xml ファイルがあります。一度にすべてを記憶することはできません。ただし、限られた量のアウトオブオーダー処理も行う必要があるため、1 回だけ連続して読み取ることはできません。XmlReaderで新しいを作成XmlReader.ReadSubTree()し、元のリーダーで次の兄弟要素にスキップし、解析を続け、後で戻って新しいリーダーを使用してサブツリーを読み取ることができることを願っていました。

ただし、これは機能していないようです。作成した新しいものはXmlReadersすべて同じ基本ストリームを使用しているように見えるため、1 つを進めるとすべてが進みます。

ただし、リーダーの基礎となるストリームが (ファイルストリームのように) シークをサポートしている場合、これは可能です。

私は Xml を 2 回連続して解析することに満足しています (これを回避する方法はありません) n

概念的に:

  • Parse1: 完全な Xml を解析します。何も出力しませんが、n必要な (交差していない) サブツリーの開始オフセットと終了オフセットを決定します。
  • Parse2: 各サブツリーを読み取りますが、それらが読み取られる順序はドキュメント順ではありません。
    • ParseSub(1): サブツリー番号をシークしてから読み取るx_1
    • ...
    • ParseSub(n): シークしてサブツリー番号を読み取るx_n

(既知のファイル オフセットまで) シークできる場合、Parse2 は全体として、Parse1 よりも Xml の読み取りを必要としないため、ファイル全体を 2 回読み取ることになります。シークできない場合は、ファイル全体を順番に読んでいると思いますn/2

4

0 に答える 0