我试图将两个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")));
答案 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发布了最简单的解决方案来解决你想要做的事情。我在这里留下这个答案,但是为了解释为什么你尝试的选择语句不能正常工作。