我有一个带有汽车集合的xml文件。如果汽车是绿色的,我想删除元素A
和B
:
<?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
答案 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();