简体   繁体   English

LINQ to XML 嵌套元素

[英]LINQ to XML nested elements

I can read the XML and return the Order Element.我可以读取 XML 并返回 Order 元素。

I also need to return the ShippingAddress with is nested in the Order Element.我还需要返回嵌套在 Order 元素中的 ShippingAddress。 (Name, AddressLine1, City, PostalCode, CountryCode, Phone) at the same time from the XML Response. (Name, AddressLine1, City, PostalCode, CountryCode, Phone) 同时来自 XML 响应。

Please can someone show me how to reach the ShippingAddress at the same time.请有人告诉我如何同时到达送货地址。

My current code is我目前的代码是

private static IEnumerable<FormsPersistence> Addresses(XContainer doc)
    {
        XNamespace ns = "https://mws.amazonservices.com/Orders/2013-09-01";

        return from address in doc.Descendants(ns + "Order")
               select new FormsPersistence
               {
                   AmazonOrderId = (string)address.Element(ns + "AmazonOrderId").Value ?? string.Empty,
                   PurchaseDate = (string)address.Element(ns + "PurchaseDate").Value ?? string.Empty,
                   BuyerName = (string)address.Element(ns + "BuyerName").Value ?? string.Empty,
                   BuyerEmail = (string)address.Element(ns + "BuyerEmail").Value ?? string.Empty,
                   OrderStatus = (string)address.Element(ns + "OrderStatus").Value ?? string.Empty,
               };
    }

    private static void OrderDetails(IEnumerable<FormsPersistence> addresses)
    {


        foreach (var address in addresses)
        {
            Console.WriteLine("---");
            Console.WriteLine(address.AmazonOrderId);
            Console.WriteLine(address.PurchaseDate);
            Console.WriteLine(address.BuyerName);
            Console.WriteLine(address.BuyerEmail);
            Console.WriteLine(address.OrderStatus);
            Console.WriteLine("---");
        }
    }

The XML Response is XML 响应是

<ListOrdersResult>
<CreatedBefore>10/23/2017 14:09:56</CreatedBefore>
<Orders>
  <Order>
    <AmazonOrderId>026-000000-000000</AmazonOrderId>
    <PurchaseDate>10/20/2017 13:45:17</PurchaseDate>
    <LastUpdateDate>10/20/2017 14:16:38</LastUpdateDate>
    <OrderStatus>Unshipped</OrderStatus>
    <FulfillmentChannel>MFN</FulfillmentChannel>
    <SalesChannel>Amazon.co.uk</SalesChannel>
    <ShipServiceLevel>Std UK Dom_1</ShipServiceLevel>
    <ShippingAddress>
      <Name>kkkkk kkkk</Name>
      <AddressLine1>22 kkkkk road</AddressLine1>
      <City>London</City>
      <PostalCode>SW14 JBD</PostalCode>
      <CountryCode>GB</CountryCode>
      <Phone>0000000000</Phone>
    </ShippingAddress>
    <OrderTotal>
      <CurrencyCode>GBP</CurrencyCode>
      <Amount>46.00</Amount>
    </OrderTotal>
    <NumberOfItemsShipped>0</NumberOfItemsShipped>
    <NumberOfItemsUnshipped>6</NumberOfItemsUnshipped>
    <PaymentExecutionDetail />
    <PaymentMethod>Other</PaymentMethod>
    <PaymentMethodDetails>
      <PaymentMethodDetail>Standard</PaymentMethodDetail>
    </PaymentMethodDetails>
    <MarketplaceId>A1F83G8C2ARO7P</MarketplaceId>
    <BuyerEmail>kkkkk@kkkkk.amazon.co.uk</BuyerEmail>
    <BuyerName>kkk akkkk</BuyerName>
    <ShipmentServiceLevelCategory>Standard</ShipmentServiceLevelCategory>
    <ShippedByAmazonTFM>False</ShippedByAmazonTFM>
    <OrderType>StandardOrder</OrderType>
    <EarliestShipDate>10/23/2017 00:00:00</EarliestShipDate>
    <LatestShipDate>10/24/2017 23:59:59</LatestShipDate>
    <EarliestDeliveryDate>10/25/2017 00:00:00</EarliestDeliveryDate>
    <LatestDeliveryDate>10/27/2017 23:59:59</LatestDeliveryDate>
    <IsBusinessOrder>False</IsBusinessOrder>
    <IsPrime>False</IsPrime>
    <IsPremiumOrder>False</IsPremiumOrder>
    <IsReplacementOrder>False</IsReplacementOrder>
  </Order>
</Orders>

The Class Files类文件

class FormsPersistence
{
    public string AmazonOrderId { get; set; }
    public string MerchantOrderID { get; set; }
    public string PurchaseDate { get; set; }
    public string OrderStatus { get; set; }
    public string ASIN { get; set; }
    public string SKU { get; set; }
    public string ItemStatus { get; set; }
    public string ProductName { get; set; }
    public string Quantity { get; set; }
    public string BuyerName { get; set; }
    public string BuyerEmail { get; set; }
    public string Name { get; set; }
    public string AddressLine1 { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
    public string CountryCode { get; set; }
    public string Phone { get; set; }
    public string ShippingAddress { get; set; }
}

and I added我补充说

class ShippingAddress
{
    public string Name { get; set; }
    public string AddressLine { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
    public string CountryCode { get; set; }
    public string Phone { get; set; }
  }

Well supposing that FormsPersistence has a property to save that, you can do the following:假设FormsPersistence有一个属性来保存它,您可以执行以下操作:

  return from address in doc.Descendants(ns + "Order")
         let shipping=address.Element(ns+"ShippingAddress")
         select new FormsPersistence
           {
               AmazonOrderId = (string)address.Element(ns + "AmazonOrderId").Value ?? string.Empty,
               PurchaseDate = (string)address.Element(ns + "PurchaseDate").Value ?? string.Empty,
               BuyerName = (string)address.Element(ns + "BuyerName").Value ?? string.Empty,
               BuyerEmail = (string)address.Element(ns + "BuyerEmail").Value ?? string.Empty,
               OrderStatus = (string)address.Element(ns + "OrderStatus").Value ?? string.Empty,
               ShippingAddress= new ShippingAddress{Name=(string)shipping.Element(ns+"Name"),
                                                    AddressLine=(string)shipping.Element(ns+"AddressLine1"),
                                                   }
           };

You need to use Element method, which allows you to get a inner element of the current node, and with the help of let clause you can save the result to use it later in your projection as I show in the code above.您需要使用Element方法,它允许您获取当前节点的内部元素,并且在let子句的帮助下,您可以保存结果以便稍后在投影中使用它,如我在上面的代码中所示。

The trick is to use Elements and then use FirstOrDefault()诀窍是使用 Elements 然后使用 FirstOrDefault()

return doc.Descendants(ns + "Order").Select(address => new FormsPersistence()
               {
                   AmazonOrderId = (string)address.Element(ns + "AmazonOrderId").Value ?? string.Empty,
                   PurchaseDate = (string)address.Element(ns + "PurchaseDate").Value ?? string.Empty,
                   BuyerName = (string)address.Element(ns + "BuyerName").Value ?? string.Empty,
                   BuyerEmail = (string)address.Element(ns + "BuyerEmail").Value ?? string.Empty,
                   OrderStatus = (string)address.Element(ns + "OrderStatus").Value ?? string.Empty,
                   ShippingAddress = address.Elements(ns + "ShippingAddress").Select(shipping => new {
                        name = (string)shipping.Element(ns + "Name")
                   }).FirstOrDefault() 
               }).ToList();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM