0

新しいノードを xml ファイルに追加するコードがあり、それは完璧に動作しますが、問題があります。追加の変更を保存すると、xml ファイルの元の構造が変更されます。

元々、ファイルには次のように各ノードへの完全な行または行があります。

<DATA>
   <ROW><mk v = "2801"/><gd v = "170300"/><wn v = "00Y6354"/><bn v = ""/></ROW>
   <ROW><mk v = "2801"/><gd v = "170301"/><wn v = "00Y6355"/><bn v = ""/></ROW>
   <ROW><mk v = "2801"/><gd v = "170302"/><wn v = "00Y6356"/><bn v = ""/></ROW>
</DATA>

しかし、新しいノードを追加して変更を保存すると、構造は次のようになります。

<DATA>
   <ROW>
      <mk v = "2801"/>
      <gd v = "170300"/>
      <wn v = "00Y6354"/>
      <bn v = ""/>
   </ROW>
   <ROW>
      <mk v = "2801"/>
      <gd v = "170301"/>
      <wn v = "00Y6355"/>
      <bn v = ""/>
   </ROW>
   <ROW>
      <mk v = "2801"/>
      <gd v = "170302"/>
      <wn v = "00Y6356"/>
      <bn v = ""/>
   </ROW>
   <ROW>
      <mk v = "2341"/>
      <gd v = "170342"/>
      <wn v = "00Y9872"/>
      <bn v = "new node"/>
   </ROW>
</DATA>

最初の構造のような FINAL OUTPUT を使用していくつかの例を見つけようとしましたが、何もありません。したがって、元の構造を変更せずに変更を保存することは可能です。誰か教えてください!

私のコードは次のようなものです:

    public void CreateXML(string[] ipRow, string ipFile)
    {
        XmlDocument doc = new XmlDocument();
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(ipFile);

        for (int j = 0; j < ipRow.Length; j++)
        {
            doc.LoadXml(ipRow[j]);
            XmlNode newNode = doc.DocumentElement;
            XmlNode copiedNode = xmlDoc.ImportNode(newNode, true);
            xmlDoc.DocumentElement.LastChild.AppendChild(copiedNode);                
        }
        xmlDoc.Save(ipFile);
    }

ある種のフォーマットを適用するか、少なくともファイル内に既にあるものの元の構造を尊重するようにプログラムを示したいだけです。StringBuilders、XmlWriterSettings などを使用できると言っているフォーラムを見つけましたが、機能しません。ご覧のとおり、新しいノードは文字列から取得されるため、新しいノードの方法を変更することはできません。ノードが作成されたら、コードをそのまま保持する必要があり、元の形式を保持するルールを追加するだけです。

または、Visual Studio 2008 で C# を使用してこれを行うことが不可能であることを誰かが知っている場合は、私に教えてください (専門家と思われるユーザーのみを信頼します)。

返信してください!ありがとう。

4

1 に答える 1

1

XmlDocument を保存するだけではこれを行うことはできません。XmlTextWriter を使用して試すことができます。

using (var xmlWriter = new XmlTextWriter(filePath, Encoding.UTF8))
{
  xmlWriter.Formatting = Formatting.None;
  yourDocument.WriteTo(xmlWriter);
}

...しかし、それがあなたが探している非常に具体的なレイアウトを提供するかどうかはわかりません。

<ROW>または、ドキュメント全体を文字列として取得し (yourDocument.OuterXml を使用)、通常の文字列マッチング (おそらく REGEX が最適) を使用して、ノードの前後のものを除くすべてのキャリッジ リターンを削除できます。

これはファイルの構造に実際の違いをもたらすものではないことに注意してください。これは単なるフォーマットのケースです。

于 2012-08-28T17:40:22.053 に答える