2012-11-02 43 views
0

如何使用LINQ解析以下XML?
我需要插入到数据库表中订单编号,ShipAddress,货主国家,ShipState每个订单 & OrderCancelled
然后在一个单独的表中我需要插入OrderId退货/金额部分。如何使用LINQ解析深层嵌套到XML

<!-- language: lang-xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<OrdersReport Date="2012-08-01"> 
<Client> 
<ClientId>1</ClientId> 
    <Orders> 
    <Order> 
     <OrderNumber>1</OrderNumber> 
     <ShipAddress>123 Main St.</ShipAddress> 
     <ShipCity>MyCity</ShipCity> 
     <ShipState>AZ</ShipState> 
    </Order> 
    <Order> 
     <OrderNumber>2</OrderNumber> 
     <ShipAddress>111 Main St.</ShipAddress> 
     <ShipCity>OtherCity</ShipCity> 
     <ShipState>AL</ShipState> 
    </Order> 
    <OrderCancelled> 
     <OrderNumber>3</OrderNumber> 
     <ShipAddress>111 Main St.</ShipAddress> 
     <ShipCity>OtherCity</ShipCity> 
     <ShipState>AL</ShipState> 
    </OrderCancelled> 
    </Orders> 
    <Returns> 
    <Amount> 
     <OrderId>2</OrderId> 
     <OrderId>3</OrderId> 
    </Amount> 
    </Returns> 
</Client> 
<Client> 
<ClientId>2</ClientId> 
<!-- Same Tree structure as Client 1 --> 
</Client> 
</OrdersReport> 

根据我得到的答复,我已经更新了这个问题。

var doc = XDocument.Load(rootFolder + "Generic.xml"); 
    var query = doc.Descendants("Order") 
        .Concat(doc.Descendants("OrderCancelled")) 
        .Select(x => new 
        { 
         OrderNumber = (int)x.Element("OrderNumber"), 
         ShipAddress = (string)x.Element("ShipAddress"), 
         ShipCity = (string)x.Element("ShipCity"), 
         ShipState = (string)x.Element("ShipState") 
        });   

    var amount = doc.Descendants("Amount")       
        .Select(y => new 
        { 
         OrderId = (int)y.Element("OrderId") 
        }); 

    foreach (var o in query) 
    { 
     Console.WriteLine(o.OrderNumber + o.ShipAddress + o.ShipCity); 
    } 
    foreach (var r in amount) 
    { 
     Console.WriteLine(r.OrderId); 
    } 

枚举量只给我第一个OrderId,我做错了什么?

+0

颜色张贴:-)但仍然没有缩进后出现了。 – Picflight

回答

1

这听起来像你只是想所有后代订单/ OrderCancelled元素:

var doc = XDocument.Load("file.xml"); 
var query = doc.Descendants("Order") 
       .Concat(doc.Descendants("OrderCancelled")) 
       .Select(x => new { 
          OrderNumber = (int) x.Element("OrderNumber"), 
          ShipAddress = (string) x.Element("ShipAddress"), 
          ShipCity = (string) x.Element("ShipCity"), 
          ShipState = (string) x.Element("ShipState") 
         }); 

然后你就可以对结果进行迭代,这将是匿名类型的序列,并且做任何你需要插入它进入数据库。

+0

那么,我可以为退货做类似的选择? – Picflight

+0

@Pfflight:当然,请注意,您必须在每个“Amount”中获取每个'OrderId'元素。 –

0

我认为这是可能无连接:

var query = from o in xdoc.Descendants("Orders").Elements() 
      select new 
      { 
       OrderNumber = (int)o.Element("OrderNumber"), 
       ShipAddress = (string)o.Element("ShipAddress"), 
       ShipCity = (string)o.Element("ShipCity"), 
       ShipState = (string)o.Element("ShipState") 
      }; 
+0

如何满足“对于每个Order&OrderCancelled”? –

+0

@JonSkeet对不起,忘了做'Elements()' –

+0

对,就这样做 - 只要有'Orders'中没有任何其他元素。 –