【问题标题】:How do I combine two XElements with linq select?如何将两个 XElement 与 linq select 结合使用?
【发布时间】:2015-07-28 12:39:37
【问题描述】:

我正在尝试将两个 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")));

代码无法编译,因为选择错误(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" />

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    我会放弃 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

    【讨论】:

    • 这正是我想要的,效果很好,因为我可以将 e1 和 e2 的属性分组,并且仍然使用构造函数。
    【解决方案2】:

    您收到错误的原因是Select() 操作必须返回一个对象。您实际上是在尝试在 Select() 操作中执行 foreach,这不是它所使用的。 LINQ 不包含 foreach 操作,因为它可能有副作用,因此您应该使用其他方法。

    编辑: 我最初发布的内容将连接列表而不是合并它们。我打算发布另一个答案,但@Charles Mager 发布了您尝试做的最简单的解决方案。我在这里留下这个答案是为了解释为什么您尝试的 select 语句不能正常工作。

    【讨论】:

    • 这只会将所有元素连接在一起 - 需要的是问题中显示的合并输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2016-09-27
    • 1970-01-01
    • 2010-12-25
    • 2011-01-17
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多