0

50000を超えるレコードを含むXMLファイルがあります(将来のレコードには最大500 000のレコードが含まれる可能性があります)。各レコードには3つのレベルがあります。メインレベル(レコードを区別するために使用)、共通データレベル(タグには各レコードを定義する属性が含まれます)、3番目のレベルには各レコードに固有のデータ(主に属性として、場合によっては内部テキストとして)が含まれます。私の仕事は、このファイルを複数の小さなファイルに「分析」することです。レコード全体がどのグループに属するかを決定する第3レベルの属性があります。

アルゴリズムは次のようになります。

ファイル内の各レコードについて:

  • レコードが属するグループを判別するために必要な情報を含む属性を読み取ります(これは簡単です。この部分を解決しました)
  • レコード全体(すべてのレベルのすべての文字)を適切なファイルにコピーします

だから私の質問は、データを新しいファイルにコピーするための最も簡単な(そして最も効率的な方法)は何ですか?特定のデータだけでなく、レコード全体をコピーする必要があることに注意してください。私はVS2010を使用してC#で作業しています。

4

3 に答える 3

1

(パフォーマンスに関して)最も効率的な方法はXmlReader、大きなファイルを通過する単一のインスタンスを持つことです。宛先となる可能性のあるグループがいくつかあるXmlWriterため、次の繰り返しのために、オンデマンドで作成し、「グループ キー」によってインデックス付けされたディクショナリに格納する の複数のインスタンスが必要です。

を使用するXmlReaderXmlWriter、ファイル全体をメモリにロードすることを回避できます。

ネストされたレベルを追跡するには、 を使用してStack、内側に移動するときにアイテムをプッシュし、外側に移動するときにアイテムをポップするか、メソッド内のローカル変数だけを使用できます。

Stream完了したら、インスタンスを閉じることを忘れないでください。

于 2012-06-19T09:49:30.737 に答える
1

を使用しXmlReaderてソース ファイルのノードを進み、要件を満たすノードに遭遇したら、それを読み取って新しいファイルにコピーします (InnerXml現在のノードのプロパティは、保存できる文字列表現全体を提供します)。新しいファイルに)。

ところで、XML が数百万レコードのサイズに拡大すると予想される場合は、この拡大を事前に予測し、そのような量のデータの処理により適したデータベースに切り替えることをお勧めします。

于 2012-06-19T09:42:31.753 に答える
0

を通じてSystem.Xml、操作を実行できます。を作成し、List<XmlElement>それぞれの 3 つのレベルをカバーします。

   XmlDocument doc = new XmlDocument();
      doc.Load("Test.xml");
      XmlElement root = doc.DocumentElement;
    //Preform your read and write operation here
     doc.Save("Test.xml");
于 2012-06-19T09:53:03.103 に答える