如何使用linq select组合两个xelement
本文关键字:两个 xelement 何使用 linq select 组合 | 更新日期: 2023-09-27 18:05:11
我正在尝试将两个xelement列表合并为一个:
var list1 = XElement.Parse(@"<root><Element name=""foo"">
<ChildElement name=""childFoo"">
<SubChildElement name=""subChildFoo"" />
</ChildElement>
</Element>
<Element name=""bar"">
<ChildElement name=""childBar"">
<SubChildElement name=""subChildBar"" />
</ChildElement>
</Element>
<Element name=""zoo"" /></root>").XPathSelectElements("Element").ToList();
var list2 = XElement.Parse(@"<root><Element name=""foo"" attr=""fooAtr"" />
<Element name=""bar"" attr=""barAtr"" />
<Element name=""zoo"" attr=""barAtr"" /></root>").XPathSelectElements("Element").ToList();
var res = from e2 in list2
join e1 in list1
on e2.Attribute("name").Value equals e1.Attribute("name").Value
select new XElement(e1.Add(e2.Element("ChildElement")));
代码不会编译,因为选择是错误的(XElement.Add()返回void)。
如何在select中组合两个xelement: e1和e2并返回新的xelement (e2与来自e1的子元素)
我想获得如下格式的列表:
<Element name="foo" attr="fooAtr">
<ChildElement name="childFoo">
<SubChildElement name="subChildFoo" />
</ChildEelement>
</Element>
<Element name="bar" attr="barAtr">
<ChildElement name="childBar">
<SubChildElement name="subChildBar" />
</ChildEelement>
</Element>
<Element name="zoo" attr="barAtr" />
我将放弃XPath而使用LINQ to XML查询方法来查找元素。您的select
需要从第二个元素复制名称和属性,从第一个元素复制子元素:
var results = from e2 in second.Descendants("Element")
join e1 in first.Descendants("Element")
on (string)e2.Attribute("name") equals (string)e1.Attribute("name")
select new XElement(e2.Name, e2.Attributes(), e1.Elements());
查看这里的工作演示:https://dotnetfiddle.net/J3mcXu
出现错误的原因是Select()
操作必须返回一个对象。您实际上是试图在Select()操作中执行foreach操作,这不是它所使用的。LINQ不包括foreach操作,因为它可能有副作用,所以你应该使用另一种方法。
EDIT:我最初发布的内容将连接列表而不是合并它们。我本来打算发布另一个答案,但是@Charles Mager发布了一个最简单的解决方案。我在这里留下这个答案来解释为什么你尝试的select语句没有正常工作。