2015-08-08 33 views
4

鑑於兩個XML文件這樣的:C#的LINQ to XML:如何加入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"); 

有了這個我不能得到數據「愛麗絲」和「蘋果」。其結果是這樣的:

<Result> 
    <Join> 
    <Customer CustomerID="alc" /> 
    <Order OrderID="001" CID="alc" /> 
    </Join> 
</Result> 

我想,也許是(string)customer.Element("Customer")(string)order.Element("Order")有一些問題,我不知道如何修改這些。

回答

1

您只需cast an element to a 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"))))); 
+0

好極了!謝謝!! –

1

您只需在創建Join元素的傳遞,而不是爲與創建新XElement S中customerorder變量:

select new XElement("Join", customer, order); 

working demo example :

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>