2010-01-29 90 views
3

我有這個XML,我希望能夠拉出訂單#,項目,數量,ItemPrice(委託人,稅收,也可以是其他人)。這裏是XML(見下文)。我遇到的問題是ItemPrice。有了它,你可以從0到很多價格組成部分,稅金,本金等等。我怎樣才能將這些轉換爲單行輸出?幫助使用Linq查詢XML

現在我可以得到orderNumber,ItemNumber,Qty ...但是當我拉價格時,我得到一個稅和prinicpal的行。

另一個問題是,如果在某些情況下稅收不在那裏會發生什麼?我會得到一個空引用不會嗎?我想嘗試和處理這些,只是替代0.任何建議都非常appreicated。

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<SettlementReport> 
<Order> 
    <AmazonOrderID>105-6982537-6258888</AmazonOrderID> 
    <ShipmentID>MyShipmentIDTest1234</ShipmentID> 
    <MarketplaceName>Amazon.com</MarketplaceName> 
    <Fulfillment> 
     <MerchantFulfillmentID>MyTestFulFillID12345</MerchantFulfillmentID> 
     <PostedDate>2008-12-15T19:33:04+00:00</PostedDate> 
     <Item> 
      <AmazonOrderItemCode>13350774331938</AmazonOrderItemCode> 
      <SKU>U1409</SKU> 
      <Quantity>1</Quantity> 
      <ItemPrice> 
       <Component> 
         <Type>Principal</Type> 
         <Amount currency="USD">0.15</Amount> 
        </Component> 
       <Component> 
         <Type>Tax</Type> 
         <Amount currency="USD">0.02</Amount> 
        </Component> 
       </ItemPrice> 
      </Item> 
      <Item> 
      <AmazonOrderItemCode>13350774331939</AmazonOrderItemCode> 
      <SKU>U14010</SKU> 
      <Quantity>2</Quantity> 
      <ItemPrice> 
       <Component> 
         <Type>Principal</Type> 
         <Amount currency="USD">0.30</Amount> 
        </Component> 
       <Component> 
         <Type>Tax</Type> 
         <Amount currency="USD">0.04</Amount> 
        </Component> 
       </ItemPrice> 
      </Item> 
     </Fulfillment> 
    </Order> 
</SettlementReport> 

我的代碼:

  XDocument customer = XDocument.Load(@"C:\LinqToXML.xml"); 

      var orders = from amznorders in customer.Root.Elements("Order") 
         from amznfulfill in amznorders.Elements("Fulfillment") 
         from amznitems in amznfulfill.Elements("Item") 
         from amznitemprc in amznitems.Elements("ItemPrice").Elements("Component") 
          select new 
             { 
              OrderNumber = (string)amznorders.Element("AmazonOrderID"), 
              ItemNumber = (string)amznitems.Element("AmazonOrderItemCode"), 
              QTY = (string)amznitems.Element("Quantity"), 
              //This is where I need help...if type = Principal set PriceAmount else Set PriceTax?// 
              PriceAmount = (string)amznitemprc.Element("Amount") 
              //Address1 = (string)address1.Element("Address1") 
            }; 

      foreach (var order in orders) 
      { 
       Console.WriteLine("Order: {0} ItemNumber: {1} QTY: {2} PriceAmount: {3} ", order.OrderNumber, order.ItemNumber, order.QTY, order.PriceAmount); 

      } 

回答

0

可行的,但無可否認有點尷尬。我可能會使用一對let變量來保存我想要的子組件(假設您只需要這兩個特定的值)。

編輯刪除由於Where子句問題引起的。我不認爲有選擇的地方有問題,但它可能有同樣的問題。

var orders = from amznorders in customer.Root.Elements("Order")  
      from amznfulfill in amznorders.Elements("Fulfillment")  
      from amznitems in amznfulfill.Elements("Item")  
      from amznitemprc in amznitems.Elements("ItemPrice").Elements("Component")  
      select new  
         {  
           OrderNumber = (string)amznorders.Element("AmazonOrderID"),  
           ItemNumber = (string)amznitems.Element("AmazonOrderItemCode"),  
           Qty = (string)amznitems.Element("Quantity"), 
           PriceAmount = amznitemprc.Where(xe => xe.Element("Type").Value == "Principal").FirstOrDefault().Value, 
           TaxAmount = amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault() == null ? string.Empty : amxnitemprc.Where(xe => xe.Element("Type").Value == "Tax").FirstOrDefault(), 
           TotalItemPrice = amznitemprc.Sum(xe => decimal.Parse(xe.Element("Amount").Value)).ToString(), 
           //Address1 = (string)address1.Element("Address1")  
         }; 
+0

雅各布,使用不同的方法會更好嗎?我沒有被Linq困住,只是覺得我應該嘗試利用它。 感謝您的提示,我會檢查出來。 – scarpacci 2010-01-30 04:05:47

+0

當我嘗試它時,let變量中的Where似乎不被識別。有什麼想法嗎? – scarpacci 2010-01-30 14:25:31

+0

有趣。我想知道Where Where會在以後註冊。我不在一個地方,我可以在明天之前對它進行測試,但是我會編輯一些東西。不過,它會有點複雜。 – 2010-02-01 04:57:14