XElement -将多个元素连接到一个下



我在将两个XML合并为一个时遇到了麻烦。

第一个XML:

<?xml version="1.0" encoding="utf-8"?>
<SalesOrderHeader>
<SOFields>
<CompanyName>company</CompanyName>
<joinKey>c9e60279-6759-eb11-a2e4-00155d0a9c55</joinKey>
<SalesId>SO100001</SalesId>
</SOFields>
</SalesOrderHeader>

第二XML:

<?xml version="1.0" encoding="utf-8"?>
<SalesOrderLines>
<SOL>
<CompanyName>company</CompanyName>
<SOLUniqueKey>fe695341-6959-eb11-a2e4-00155d0a9c55</SOLUniqueKey>
<ItemId>12345</ItemId>
<ItemName>ItemName1</ItemName>
<SalesOrderJoinKey>c9e60279-6759-eb11-a2e4-00155d0a9c55</SalesOrderJoinKey>
<SalesAmount>100.0000</SalesAmount>
<SalesPrice>20.0000</SalesPrice>
</SOL>
<SOL>
<CompanyName>company</CompanyName>
<SOLUniqueKey>ff695342-6959-eb11-a2e4-00155d0a9c55</SOLUniqueKey>
<ItemId>34597</ItemId>
<ItemName>ItemName2</ItemName>
<SalesOrderJoinKey>c9e60279-6759-eb11-a2e4-00155d0a9c55</SalesOrderJoinKey>
<SalesAmount>5.0000</SalesAmount>
<SalesPrice>10.0000</SalesPrice>
</SOL>
<SOL>
<CompanyName>company</CompanyName>
<SOLUniqueKey>fz695343-6959-eb11-a2e4-00155d0a9c55</SOLUniqueKey>
<ItemId>65874</ItemId>
<ItemName>ItemName3</ItemName>
<SalesOrderJoinKey>c9e60279-6759-eb11-a2e4-00155d0a9c55</SalesOrderJoinKey>
<SalesAmount>10.0000</SalesAmount>
<SalesPrice>24.0000</SalesPrice>
</SOL>
</SalesOrderLines>

这两个XML文件是用XElement形成的。我正在尝试像这样连接这两个文件:

var newSOH = new XElement("SalesOrder",
from c in xmlElement.Element("SalesOrderHeader").Elements("SOFields")
join o in xmlElementSOL.Element("SalesOrderLines").Elements("SOL")
on (string)c.Element("joinKey") equals
(string)o.Element("SalesOrderJoinKey")

join元素为joinKeySalesOrderJoinKey索尔。

但是,此连接导致"对象引用"未设置为对象的实例。

最终的结果是,第二个XML (SalesOrderLInes)文件中的所有元素将位于一个销售订单标头之下,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<SalesOrder>
<SalesOrderHeader>
<SOFields>
<CompanyName>company</CompanyName>
<joinKey>c9e60279-6759-eb11-a2e4-00155d0a9c55</joinKey>
<SalesId>SO100001</SalesId>
</SOFields>
</SalesOrderHeader>
<SalesOrderLines>
<SOL>
<CompanyName>company</CompanyName>
<SOLUniqueKey>fe695341-6959-eb11-a2e4-00155d0a9c55</SOLUniqueKey>
<ItemId>12345</ItemId>
<ItemName>ItemName1</ItemName>
<SalesOrderJoinKey>c9e60279-6759-eb11-a2e4-00155d0a9c55</SalesOrderJoinKey>
<SalesAmount>100.0000</SalesAmount>
<SalesPrice>20.0000</SalesPrice>
</SOL>
<SOL>
<CompanyName>company</CompanyName>
<SOLUniqueKey>ff695342-6959-eb11-a2e4-00155d0a9c55</SOLUniqueKey>
<ItemId>34597</ItemId>
<ItemName>ItemName2</ItemName>
<SalesOrderJoinKey>c9e60279-6759-eb11-a2e4-00155d0a9c55</SalesOrderJoinKey>
<SalesAmount>5.0000</SalesAmount>
<SalesPrice>10.0000</SalesPrice>
</SOL>
<SOL>
<CompanyName>company</CompanyName>
<SOLUniqueKey>fz695343-6959-eb11-a2e4-00155d0a9c55</SOLUniqueKey>
<ItemId>65874</ItemId>
<ItemName>ItemName3</ItemName>
<SalesOrderJoinKey>c9e60279-6759-eb11-a2e4-00155d0a9c55</SalesOrderJoinKey>
<SalesAmount>10.0000</SalesAmount>
<SalesPrice>24.0000</SalesPrice>
</SOL>
</SalesOrderLines>
</SalesOrder>

我试着遵循这个例子https://learn.microsoft.com/en-us/dotnet/standard/linq/join-two-collections但是从我在其他帖子中读到的这种方法对我不起作用。

谢谢你给我的建议。

既然您已经将每个XML解析为一个XElement,它已经引用了根元素,因此您不需要在查询中再提及根元素:

var newSOH = new XElement("SalesOrder",
from c in xmlElement.Elements("SOFields")
join o in xmlElementSOL.Elements("SOL")
on (string)c.Element("joinKey") equals
(string)o.Element("SalesOrderJoinKey")
select new List<XElement>(){
new XElement("SalesOrderHeader", c),
new XElement("SalesOrderLines", o)
});

System.Console.WriteLine(newSOH.ToString());

dotnetfiddle演示

最新更新