【问题标题】:How to parse XML header and nested sections using LINQ如何使用 LINQ 解析 XML 标头和嵌套部分
【发布时间】:2012-11-06 21:59:59
【问题描述】:
XElement documentRoot = XElement.Parse(@"<OrdersReport Date='2012-08-01'>
                <SettingHeader>
                  <SettingId>1</SettingId>
                </SettingHeader>
                  <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>222 Main St.</ShipAddress>
                        <ShipCity>CancelledCity</ShipCity>
                        <ShipState>AL</ShipState>
                      </OrderCancelled>
                    </Orders>
                    <Returns>
                      <Amount>
                        <OrderId>2</OrderId>
                        <OrderId>3</OrderId>
                        <OrderId>21</OrderId>       
                      </Amount>
                    </Returns>
                  </Client>
                  <Client>
                    <ClientId>2</ClientId>    
                  </Client>
                </OrdersReport>");

代码:

        var orders = documentRoot.Descendants("Order")
                       .Concat(documentRoot.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")
                       });

        foreach (var o in orders)
        {
            Console.WriteLine(o.OrderNumber + " " + o.ShipAddress + " " 
                + o.ShipCity);
        }

输出:

1 123 Main St. MyCity
2 111 Main St. OtherCity
3 222 Main St. CancelledCity
3 222 Main St. CancelledCity

如何像下面的输出一样附加 ClientIdSettingId

目标输出:

1 123 Main St. MyCity ClientId 1 SettingId 1
2 111 Main St. OtherCity ClientId 1 SettingId 1
...

【问题讨论】:

  • 您的代码中有一个无法识别的“doc”对象。这是从哪里来的?
  • @RyanGates +1 鹰眼。

标签: c# .net xml linq


【解决方案1】:

试试这个:

var orders = doc.Descendants("Order").Select(x => new
    {
        OrderNumber = (int)x.Element("OrderNumber"),
        ShipAddress = (string)x.Element("ShipAddress"),
        ShipCity = (string)x.Element("ShipCity"),
        ShipState = (string)x.Element("ShipState"),
        ClientId = (int)x.Ancestors("Client").First().Element("ClientId"),
        SettingId = (int)doc.Descendants("SettingId").First(),
    });

【讨论】:

    【解决方案2】:
    //pick the "settingId" first, it won't change in the XML
    string settingId = 
        documentRoot.Descendants("SettingId").Single().Value;
    
    var orders =
        //each client has its own clientId and Orders
        from c in documentRoot.Descendants("Client")
        let clientId = c.Element("ClientId").Value
        //search for the "Orders" tag and pick all their children 
        //this will include both "Order" and "OrderCancelled"
        from o in c.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"),
            ClientId = clientId,
            SettingId = settingId
        };
    

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2012-02-21
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多