Linq to XML - 选择多个元素

时间:2016-07-06 07:59:58

标签: c# linq-to-xml

我有一个带有汽车集合的xml文件。如果汽车是绿色的,我想删除元素AB

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Cars>
    <Car>
        <Color>Green</Color>
        <A>Value</A>
        <B>Value</B>
    </Car>
    <Car>
        <Color>Blue</Color>
        <A>Value</A>
        <B>Value</B>
    </Car>
    <Car>
        <Color>Yellow</Color>
        <A>Value</A>
        <B>Value</B>
    </Car>
</Cars>

我做:

XDocument.Root.Descendants("Car").Where(x => x.Element("Color").Value == "Green"). Select(x => x.Element("A")).Remove();

XDocument.Root.Descendants("Car").Where(x => x.Element("Color").Value == "Green"). Select(x => x.Element("B")).Remove();

它的工作但如何在一行中完成这项工作?如何在Select中选择两个元素?

感谢&#39; S

1 个答案:

答案 0 :(得分:2)

这是一种可能的方法,找到值等于'绿色'的Color元素,使用ElementsAfterSelf()抓取所有以下兄弟元素,使用SelectMany()展平它们,最后删除它们:

XDocument.Root
         .Descendants("Car")
         .Elements("Color")
         .Where(c => c.Value == "Green")
         .SelectMany(c => c.ElementsAfterSelf())
         .Remove();

更新:

如果目标元素严格需要通过名称识别,例如不一定是<Color>之后的所有元素,则可以使用Where()方法,如下所示:

XDocument.Root
         .Descendants("Car")
         .Where(c => (string)c.Element("Color") == "Green")
         .SelectMany(c => c.Elements()
                           .Where(e => e.Name.LocalName == "A" ||
                                       e.Name.LocalName == "B"))
         .Remove();

如果目标元素名称列表可能增长到2以上(“A”和“B”),我建议使用数组和Contains()进行过滤:

var targetElementNames = new[]{ "A", "B", "C" };
XDocument.Root
         .Descendants("Car")
         .Where(c => (string)c.Element("Color") == "Green")
         .SelectMany(c => c.Elements()
                           .Where(e => targetElementNames.Contains(e.Name.LocalName))
         .Remove();