2015-08-08 1 views
4

Учитывая два XML-файлы, как эти:C# LINQ к 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

Вы можете просто передать customer и order переменные при создании Join элемента, вместо того, чтобы создавать новые XElement с для того же:

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>