C#LINQ to XML:如何联接XML数据
本文关键字:XML 何联接 数据 to C#LINQ | 更新日期: 2023-09-27 18:06:53
给定如下两个XML文件:
<Customers>
<Customer CustomerID="alc">Alice</Customer>
</Customer>
和
<Orders>
<Order OrderID="001" CID="alc">apple</Order>
</Orders>
现在我需要连接这两个XML文件,并使用内部连接创建一个新文件:
<Result>
<Join>
<Customer CustomerID="alc">Alice</Customer>
<Order OrderID="001" CID="alc">apple</Order>
</Join>
</Result>
我有这个问题:
var result = new XElement("Result",
from customer in XElement.Load("Customers.xml").Elements("Customer")
join order in XElement.Load("Orders.xml").Elements("Order")
on
(string)customer.Attribute("CustomerID")
equals
(string)order.Attribute("CID")
select new XElement("Join",
new XElement("Customer", (string)customer.Element("Customer"),
new XAttribute("CustomerID", (string)customer.Attribute("CustomerID"))),
new XElement("Order", (string)order.Element("Order"),
new XAttribute("OrderID", (string)order.Attribute("OrderID")),
new XAttribute("CID", (string)order.Attribute("CID")))));
result.Save("result.xml");
有了这个,我就无法获得"爱丽丝"answers"苹果"的数据。结果是这样的:
<Result>
<Join>
<Customer CustomerID="alc" />
<Order OrderID="001" CID="alc" />
</Join>
</Result>
我想(string)customer.Element("Customer")
和(string)order.Element("Order")
可能有一些问题,我不知道如何修改这些问题。
您只需将元素强制转换为string
即可获得其文本值:
select new XElement("Join",
new XElement("Customer", (string)customer,
new XAttribute("CustomerID", (string)customer.Attribute("CustomerID"))),
new XElement("Order", (string)order,
new XAttribute("OrderID", (string)order.Attribute("OrderID")),
new XAttribute("CID", (string)order.Attribute("CID")))));
您可以在创建Join
元素时简单地传递customer
和order
变量,而不是为相同的元素创建新的XElement
:
select new XElement("Join", customer, order);
工作演示示例:
var customersxml = @"<Customers>
<Customer CustomerID='alc'>Alice</Customer>
</Customers>";
var ordersxml = @"<Orders>
<Order OrderID='001' CID='alc'>apple</Order>
</Orders>";
var result = new XElement("Result",
from customer in XElement.Parse(customersxml).Elements("Customer")
join order in XElement.Parse(ordersxml).Elements("Order")
on (string)customer.Attribute("CustomerID") equals (string)order.Attribute("CID")
select new XElement("Join", customer, order));
Console.WriteLine(result.ToString());
输出:
<Result>
<Join>
<Customer CustomerID="alc">Alice</Customer>
<Order OrderID="001" CID="alc">apple</Order>
</Join>
</Result>