【问题标题】:Inserting XML nodes and inner nodes to an existing XML document in C#在 C# 中将 XML 节点和内部节点插入到现有 XML 文档
【发布时间】:2015-12-15 05:58:40
【问题描述】:

目前我有一个可用的 C# 程序,其工作方式如下:

  1. 接受带有值的 .xls 模板(xls 由用户手动创建)
  2. 将值(匹配字段)保存到数据库中
  3. 将 .xls 转换并写入 XML。请参阅下面的示例输出:

    Existing XML Structure

现在,我想做的是:

  1. 读取现有的xml(创建的xml)
  2. 插入另一组节点和子节点(ReleaseLine 和子节点)。它必须接受多个 ReleaseLine。
  3. 保存/创建带有附加节点的新 xml。请看下面的输出:

    This is what I'm looking for:

我现有的 C# 程序很简单,但 XML 节点和层次结构非常深。我刚刚使用new XElement 方法创建了C# 代码并为每个节点传递值。然后我简单地使用xmlDocument.Save() 方法来编写xml。

[现有的 XML 程序][3]

【问题讨论】:

    标签: c# xml nodes


    【解决方案1】:

    要在现有的 xml 数据中添加节点或附加内容,我会使用 Linq to XML。

     XElement xml = XElement.Load("file.xml");
    
            xml.Add( new XElement("uberNode",
            new XElement("childNode", content),
            new XElement("anotherChildNode", content)));
            xml.Save("file.xml");
    

    Here 是一些其他相关的解决方案。

    添加到特定节点(举例):

    遵循现有的 XML 数据:

    `<Names>
      <Name>
        <prename>John</prename>
        <lastname>Snow</lastname>
      </Name>
      <Name>
        <prename>Harry</prename>
        <lastname>Harry</lastname>
      </Name>
    </Names>`
    

    现在我想在第一个“prename”标签之前添加一个“age”标签,在第一个“lastname”标签之后添加一个“family”标签。

      XElement xml = XElement.Load("file.xml");
    
                var childrens = xml.DescendantsAndSelf().ToArray();
                var first_prename = childrens[2];
                var first_lastname = childrens[3];
                Console.WriteLine(childrens[0]); //prints out the whole content
    
                first_prename.AddBeforeSelf(new XElement("age", 22));
    
            first_lastname.AddAfterSelf(new XElement("family", new XElement("mother", "paula"), new XElement("father", "paul")));
    
            xml.Save("file.xml");
    

    结果:

    `<Names>
      <Name>
        <age>22</age>
        <prename>John</prename>
        <lastname>Snow</lastname>
        <family>
          <mother>paula</mother>
          <father>paul</father>
        </family>
      </Name>
      <Name>
        <prename>Harry</prename>
        <lastname>Harry</lastname>
      </Name>
    </Names>`
    

    我遇到了这个问题,Linq 给了我最简单的方法来解决这个问题! 还有其他类似的方式,例如here。但我尝试了更多,而 DescendantsAndSelf() 让我更容易通过。

    【讨论】:

    • 感谢您的快速回复。我尝试使用以下代码在 ReleaseLine 节点中插入新的节点集,但是它被插入到 XML 的根目录中。如何将新节点插入正确的子节点?这是我的代码。再次感谢您的帮助。
    • 我编辑了我的最后一个答案。我也要感谢你,因为我现在必须解决这个问题! ——
    • 像魅力一样工作,感谢 Stophano。我改用 xml.Descendants() 方法,但是您提供的解决方案很有帮助,再次感谢,干杯!
    • 嗨,Stophane,假设 节点上方的元素是动态的并且不断变化(即 节点),假设数组 children 编号与 childrens [ 3],或者它可能是孩子[6],这取决于我的 excel 电子表格的值。您如何编写代码以使您的 节点灵活并在 节点下自动调整?再次感谢您的帮助。
    • 嗨 Arthur,如果记住以下两个链接,可以为您提供快速的解决方案。第一个链接解释了如何更新现有值,第二个链接显示了如何选择性地替换内容。 stackoverflow.com/questions/1487653/… || stackoverflow.com/questions/5820143/…
    【解决方案2】:

    我找到了我的问题的答案,这是链接http://www.xmlplease.com/add-xml-linq 使用 XPathSelectElement 方法,我能够找到正确的节点并附加新的 XElement 块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      相关资源
      最近更新 更多