如何将两个XElements与linq select结合使用?

gre*_*eet 4 c# linq

我正在尝试将两个XElements列表合并为一个:

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")));
Run Code Online (Sandbox Code Playgroud)

代码将无法编译,因为select是错误的(XElement.Add()返回void).

如何组合两个XElements:e1和e2在select中并返回新的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" />
Run Code Online (Sandbox Code Playgroud)

Cha*_*ger 5

我会放弃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());
Run Code Online (Sandbox Code Playgroud)

请在此处查看工作演示:https://dotnetfiddle.net/J3mcXu