如何在不丢失原始结构的情况下添加XML节点?

时间:2012-08-28 17:20:54

标签: c# visual-studio-2008

我有代码,我将新节点添加到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>

我试图找到像第一个结构一样的最终输出的一些例子,但没有。所以有可能保存更改而不改变有人告诉我的原始结构!

我的代码是这样的:

    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#无法做到这一点,请告诉我(我只相信明显的专家用户)。

请回复!感谢。

1 个答案:

答案 0 :(得分:1)

冒着重复你在其他地方被告知的风险,你不能简单地通过保存你的XmlDocument来做到这一点。您可以尝试使用XmlTextWriter:

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

...但我不确定这是否会为您提供您正在寻找的非常具体的布局。

或者您可以将整个文档作为字符串(使用yourDocument.OuterXml)然后使用正常的字符串匹配(REGEX可能是最好的)来删除所有回车,除了<ROW>节点之前和之后的回车

请记住,这些都不会对文件结构产生任何实际影响 - 这只是格式化的一种情况。