我有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");
答案 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");