0

この件は以前に出ていたことは知っていますが、以前の投稿をすべて見ても、どうすればよいのかわかりません。

私のコードでは、xmlファイルを作成していくつかのもので埋めています。ファイルが作成されて閉じられると、コードは xml コードに戻り、さらに書き込みます。問題は、使用するストリーム/xml リーダー/ライターの組み合わせに関係なく、テキストのどこかでインデントがおかしくなることです。

コードは次のとおりです。

XmlDocument xml = new XmlDocument();
xml.PreserveWhitespace = true;
XmlElement root = null;

FileStream fs = null;

if (File.Exists(fileName))
{
    fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite);

    xml.Load(fs);
    if (xml.GetElementsByTagName("anndata").Count > 0)
         root = (XmlElement)xml.GetElementsByTagName("anndata").Item(0);
}
else
{
    fs = new FileStream(fileName, FileMode.CreateNew, FileAccess.ReadWrite);
    root = xml.CreateElement("anndata");
    xml.AppendChild(root);
}

    //some writing to the xml doc.

fs.SetLength(0);
xml.Save(fs);
fs.Close();

現在、すべてが xml ファイルの 1 行に収まっていますが、インデントが欲しいので、何かヒントはありますか?

編集:

最後のビットを次のように変更しました。

fs.SetLength(0);
XmlTextWriter writer = new XmlTextWriter(fs, Encoding.Unicode);
writer.Formatting = Formatting.Indented;
xml.Save(writer);
writer.Close();
fs.Close();

しかし、ファイルを 1 回作成し、さらに 2 回書き込みを行った結果、ファイルは次のようになります。

<?xml version="1.0" encoding="utf-16"?>


<anndata>
  <ann name="test1">
    <weights>
      <weight node1="7" node2="8" weight="-0.5699342" />
      <weight node1="3" node2="8" weight="-0.2840658" />
      <weight node1="0" node2="10" weight="-0.03812337" />
      <weight node1="7" node2="10" weight="0.2714444" />
      <weight node1="3" node2="10" weight="-0.2163633" />
      <weight node1="0" node2="2" weight="0.8593098" />
      <weight node1="7" node2="2" weight="-0.5274166" />
      <weight node1="3" node2="2" weight="-0.1043958" />
      <weight node1="8" node2="1" weight="0.5244942" />
      <weight node1="10" node2="1" weight="0.7568867" />
      <weight node1="2" node2="1" weight="0.7543423" />
      <weight node1="8" node2="5" weight="-0.1524385" />
      <weight node1="10" node2="5" weight="-0.09445882" />
      <weight node1="2" node2="5" weight="-0.2441895" />
      <weight node1="8" node2="11" weight="0.5473043" />
      <weight node1="10" node2="11" weight="-0.1439976" />
      <weight node1="2" node2="11" weight="0.1768849" />
      <weight node1="0" node2="1" weight="-0.4702233" />
    </weights>
  </ann>
<ann name="test1"><weights><weight node1="7" node2="8" weight="-0.5699342" /><weight node1="3" node2="8" weight="-0.2840658" /><weight nod.... //no new lines here.

編集2:

「fs.SetLength(0);」を削除する場合 うまく機能しますが、<anndata>ルート要素は2回目の書き込みで複製され、3回目の書き込みで3回目にロードすると、XmlDocumentは例外をスローします。

4

1 に答える 1

0

xmlドキュメントを使用してそれを行おうとしている方法は問題ないように見えます。ファイルからドキュメントを読み取って(そしてファイルを閉じて)、別のステップとしてドキュメントをファイルに保存してみてください(読み取り/書き込みファイルを使用してロードと保存のステップの間で切り捨てようとするのではありません)

それを超えて、保存するように依頼する前に、ドキュメントに正しいフォーマットプロパティが設定されていることを確認してください。

于 2013-02-20T19:42:16.193 に答える