繁体   English   中英

Linq to XML-选择多个元素

[英]Linq to XML - Select multiple elements

我有一个带有汽车集合的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选择两个元素?

谢谢

这是一种可能的方法,找到Color元素,其值等于'Green',使用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”),则建议使用array和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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM