3

XML ファイルを書き込もうとしていますが、サイズが大きすぎてメモリに格納できないため、直接ディスクに書き込もうとしています。XmlWriter を使用してみましたが、ファイルの末尾に追加できる機能がないため、通常のファイル ライターを使用して XML を生で書き込むことに頼ります。

ディスクに直接書き込むことができ、ファイル内の位置を上書きできるファイル書き込みクラスを知っている人はいますか?

その理由は、別の情報を追加できるようにルート要素の終了を上書きできる必要があるためですが、必要に応じて XML ファイルを読み取ることもできます。たとえば、次の XML があるとします。

<elements>
  <element>
  </element>
</elements>

これを読みたい場合は読めますが、書きたい場合は、まず</elements>タグを削除し、別の要素を追加してから、終了タグを再度追加する必要があります。

助けてくれてありがとう。

4

2 に答える 2

4

XmlTextWriterを使用できます。

書き込み用にファイルを開き、最後の要素の先頭に戻って、必要な新しい要素を XmlTextWriter で追加するだけです。ファイルを閉じるには、終了要素の生のテキストを書き込んでドキュメントを完成させれば完了です。

これは簡単で汚い例です。

次のような XML から始めます。

<?xml version="1.0" encoding="utf-8"?>
<DocumentElement>
    <FirstElem/>
</DocumentElement>

それを開いて、次のような要素を追加できます。

using (FileStream f = new FileStream(@"D:\a.xml", FileMode.OpenOrCreate, FileAccess.Write))
{
    f.Seek(-("</DocumentElement>\n".Length), SeekOrigin.End);
    using (XmlTextWriter x = new XmlTextWriter(f, Encoding.UTF8))
    {
        x.WriteStartElement("Another");
        x.WriteAttributeString("attr", "value");
        x.WriteEndElement();

        // Close the file with a new terminating end-element
        x.WriteRaw("\r\n</DocumentElement>\r\n");
    }
}

結果は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<DocumentElement>
    <FirstElem/>
<Another attr="value" />
</DocumentElement>

インデントなどは完全ではないかもしれませんが、有効な XML です。これは、xml を生のテキストとしてファイルに書き込む場合に行うこととまったく同じですが、XML ライターを利用して書式設定を行うこともできます。

いくつかのコメントにも同意します。サイズを最小化するスキーマを xml に使用することは非常に有益です。インデントをオフにします。できるだけ短い要素名と属性名を使用してください。また、リーフ要素で作業している場合は、データを cdata ではなく属性として保存すると、容量が節約されます (<element>data</element>よりもコストがかかり、元のサイズのほぼ半分に<element val="data"/>さらに圧縮できます)。<e v="data"/>

于 2012-04-20T20:47:44.440 に答える
1

(@payoのコメントが示唆しているように)ファイルストリーム、XmlTextReader(ストリームを適切な要素に配置するため)、およびXmlWriterを組み合わせて使用​​して、新しい要素を書き込んでから、終了要素を書き直すことができると思います。

于 2012-04-20T20:22:41.363 に答える