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

时间:2015-07-28 12:39:37

标签: c# linq

我试图将两个XElements列表合并为一个:

spring.datasource.url =jdbc:h2:mem:test;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;DATABASE_TO_UPPER=false;INIT=create schema if not exists test;
spring.datasource.username = sa
spring.datasource.password =
spring.datasource.driverClassName = org.h2.Driver

# Specify the DBMS
spring.jpa.database =

# Show or not log for each sql query
spring.jpa.show-sql = false



#flyway.check-location=true
flyway.locations=classpath:db/migration/mysql
flyway.schemas=test

代码不会编译,因为select错误(XElement.Add()返回void)。

如何组合两个XElements:e1和e2在select中并返回新的xelement(e2与e1中的子元素)

我想获得这种格式的列表:

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")));

2 个答案:

答案 0 :(得分: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());

在此处查看有效的演示:https://dotnetfiddle.net/J3mcXu

答案 1 :(得分:1)

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

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