如何使用LINQ to XML解析深度嵌套 [英] How to parse deeply nested using LINQ to XML

查看:63
本文介绍了如何使用LINQ to XML解析深度嵌套的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用LINQ解析以下XML?
我需要为每个 Order &插入数据库表 OrderNumber,ShipAddress,ShipCity,ShipState . OrderCancelled .
然后在另一个表格中,我需要从退货/金额部分插入 OrderId .

How do I parse the following XML using LINQ?
I need to insert into a database table OrderNumber, ShipAddress, ShipCity, ShipState for each Order & OrderCancelled.
Then in a separate table I need to insert OrderId from the Returns/Amount section.

<!-- 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>

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

Based on the responses I got, I have updated the question.

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,我在做什么错呢?

The amount enumeration is only giving me the first OrderId, what am I doing incorrectly?

推荐答案

听起来您只需要所有后代Order/OrderCancelled元素:

It sounds like you just want all the descendant Order/OrderCancelled elements:

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")
                       });

然后,您可以遍历结果(将是匿名类型的序列),并执行将其插入数据库的所有操作.

Then you can iterate over the results, which will be a sequence of the anonymous type, and do whatever you need to insert it into the database.

这篇关于如何使用LINQ to XML解析深度嵌套的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆