【问题标题】:C# LINQ to XML : how to join Xml DataC# LINQ to XML:如何加入 Xml 数据
【发布时间】:2015-08-08 07:19:21
【问题描述】:

给定两个这样的 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") 可能有一些问题,我不知道如何修改这些。

【问题讨论】:

    标签: c# xml linq join


    【解决方案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")))));
    

    【讨论】:

      【解决方案2】:

      您可以在创建Join 元素时简单地传递customerorder 变量,而不是为相同的元素创建新的XElements:

      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>
      

      【讨论】:

        猜你喜欢
        • 2011-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        相关资源
        最近更新 更多