将新元素添加到现有XML文件中的多个节点

时间:2014-05-14 14:44:08

标签: c# xml linq-to-xml

我有以下XML文件,目前有100多个客户端节点,我想使用C#为每个节点添加元素。

我的XML文件结构如下:

    <file_specs>
  <client>
    <account_number></account_number>
    <client_name></client_name>
    <file_type></file_type>
    <file_extension></file_extension>
    <file_hasdelimiter></file_hasdelimiter>
    <file_delimiter></file_delimiter>
    <central_one>false</central_one>
    <central_code>none</central_code>
    <central_two>false</central_two>
    <c_two_code>none</c_two_code>
    <header_line>true</header_line>
    <has_quotes>true</has_quotes>
    <start_line>1</start_line>
    <has_one>true</has_one>
    <one_column>2</one_column>
    <has_two>true</has_two>
    <two_column>12</two_column>
    </client

我查看了其他答案,并尝试了各种解决方案。这个有效,但仅适用于第一个客户,其他所有客户都不受影响:

        XDocument doc = XDocument.Load(@"c:/xmlconfig/sample.xml");
        doc.Root.Element("client").Add(new XElement("testing", "none"));

我尝试添加一个foreach循环,它为每个客户端节点添加了一个测试元素,但是它将所有这些元素添加到第一个条目中,所有其余的都未被触及。

     XDocument doc = XDocument.Load(@"c:/xmlconfig/miss.xml");
    foreach (var client in doc.Descendants("client"))
    {
        doc.Root.Element("client").Add(new XElement("testing", "none"));
    }

我在哪里错过了什么?

1 个答案:

答案 0 :(得分:4)

您应该为每个客户添加新元素:

XDocument doc = XDocument.Load(@"c:/xmlconfig/miss.xml");
foreach (var client in doc.Descendants("client"))
{
    // use current client
    client.Add(new XElement("testing", "none"));
}

让我们看看这里发生了什么:

foreach (var client in doc.Descendants("client"))
{
    doc.Root.Element("client").Add(new XElement("testing", "none"));
}

对于每个客户端,执行查询,该查询将根目录下的第一个客户端元素。然后将新元素添加到此第一个客户端。重复这么多次,就像xml中的客户端数量一样。并且最终测试元素添加到第一个客户端N次。