更新嵌套Xml中的元素

时间:2009-06-03 03:48:59

标签: c# .net xml linq-to-xml

我有Xml,看起来像这样:

<DataMapper xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SqlTable />
  <Level_01s>
    <DataParameter>
      <SqlTable>MY-Table-Name</SqlTable>
      <Children>
        <DataParameter>
          <SqlTable>MY-Table-Name</SqlTable>
          <Children>
            <DataParameter>
              <SqlTable>MY-Table-Name</SqlTable>
              <Children>
                <DataParameter>
                  <SqlTable>[All]</SqlTable>
                  <Children />
                </DataParameter>
                <DataParameter>
                  <SqlTable>MY-Table-Name</SqlTable>
                  <Children>
                    <DataParameter>
                      <SqlTable>[All]</SqlTable>
                      <Children />
                    </DataParameter>
                  </Children>
                </DataParameter>
              </Children>
            </DataParameter>
          </Children>
        </DataParameter>
      </Children>
    </DataParameter>
  </Level_01s>
</ DataMapper>

我想要做的是更新元素的所有实例。我遇到的问题是DataParameters可能会达到n级深度。

如何递归确保我更新所有这些?

我正在使用此代码更新根级元素:

XDocument xdoc = XDocument.Parse(myxmlstring);
var element = xdoc.Elements("SqlTable").Single();
element.Value = "foo";        
xdoc.Save("file.xml");

通过Best way to change the value of an element in C#

1 个答案:

答案 0 :(得分:3)

如果使用Descendants(“SqlTable”)而不是Elements(“SqlTable”)。Single()它将为您提供整个文档中的所有“SQLTable”元素。然后你可以通过它们来更新元素。

var elements = xdoc.Descendants("SqlTable");

foreach (var sqlTable in elements)
{
    sqlTable.Value = "foo";
}  

或者如果你想要简洁,你可以用LINQ语法

完成所有工作

根据评论更新,已添加。使用谓词构建列表作为使用条件的示例。

xdoc.Descendants("SqlTable").Where(s => s.Value != "All").ToList().ForEach(p => p.Value = "foo");