Linq Xml - 按值查找属性

时间:2012-03-12 19:18:07

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

如果我有一个简单的XML文档,例如

<case id="37d3c93c-3201-4002-b24f-08e1221c3cb7">
    <party id="26dad8c5-9487-48f2-8911-1d78c00095b2">...</party>
    <illustration CaseId="37d3c93c-3201-4002-b24f-08e1221c3cb7">....</illustration>
    <illustration CaseId="37d3c93c-3201-4002-b24f-08e1221c3cb7">....</illustration>
    <item relatedCaseId="37d3c93c-3201-4002-b24f-08e1221c3cb7">...</illustration>
</case>

我有更改case元素的id属性的代码。我现在正在寻找一些LINQ代码,它可以帮助我搜索具有与旧值匹配的属性值的所有元素,因此我可以用新值替换它。我没有属性名称列表,需要搜索整个文档。

任何提示/想法? 谢谢!

1 个答案:

答案 0 :(得分:2)

这样的事情:

var matches = doc.Descendants()
                 .Where(x => x.Attributes()
                              .Any(attr => attr.Value == oldValue));

或者,如果您只是尝试替换值,则只需要属性本身:

var attributes = doc.Descendants()
                    .Attributes()
                    .Where(attr => attr.Value == oldValue)
                    .ToList();
foreach (var attribute in attributes)
{
    attribute.Value = newValue;
}

在这种情况下,完全有可能将副本复制到列表中,但我通常更喜欢在变异XDocument时制作副本以避免混淆。 (当你删除一个元素或类似的东西时肯定是必要的 - 只是设置一个属性可能的值不会影响事情。)