2017-10-24 28 views
1

XMLを読み取り、Order要素を返すことができます。LINQ to XMLのネストされた要素

また、注文要素にネストされたShippingAddressを返す必要があります。 (Name、AddressLine1、City、PostalCode、CountryCode、Phone)をXML Responseから同時に呼び出します。

誰かが同時にShippingAddressへのアクセス方法を教えてください。

私の現在のコードは

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

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>[email protected]</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> 

あるクラスファイル

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

であると私は

を追加しました
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; } 
    } 
+0

を使用し、その後の要素を使用することです。しかし、あなたが結果に配送先住所を入れたい場合は、 'FormsPersistence'のプロパティがありますか? – octavioccl

+0

はい私はそれらをFormsPersitenceにpublic stringのように設定しています。名前{get;セット; } – jasonkkt

答えて

1

はまあ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"), 
                } 
      }; 

あなたは現在のノードの内部要素を取得することができますElementメソッドを使用する必要があり、 let節の助けを借りて、上のコードで示したように、結果を保存して後で使用することができます。

+0

が見つかりました 'shippingAddress'の型または名前が見つかりませんでした(使用するディレクティブまたはアセンブリ参照がありませんか?)新しいShippingAddressのVSで強調表示されました – jasonkkt

+0

はい、あなたのモデルでは、あなたがそれを作成したり、FormPersistenceクラスに船積み情報を直接保存するためのプロパティを追加したりすることができます(私はカスタムクラスです)。 – octavioccl

+0

私の基本的な知識を残念に思っています。私はこれにNameとAddressLineを追加した新しいクラスShippingAddressを追加しました。今すぐ取得 'AmazonMWS.src.MarketplaceWebServiceOrders.ShippingAddress'型を 'string'に暗黙的に変換することはできません – jasonkkt

0

トリックは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(); 
関連する問題