2011-07-11 157 views
0

我有以下XML從XML文檔依賴於其他值

<OrderReport> 
    <Item> 
    <Promotion>  
     <Component> 
     <Type>Principal</Type> 
     <Amount currency="USD">-0.25</Amount> 
     </Component> 
     <Component> 
     <Type>Shipping</Type> 
     <Amount currency="USD">0.00</Amount> 
     </Component> 
    </Promotion> 
    </Item> 
</OrderReport> 

我需要爲每種類型的金額選擇特定的值。以下是我想要的

var q = from orders in xDoc.Descendants("OrderReport")  
     select new 
     { 
      //This should return me the Principal Amount 
      ItemDiscountAmount = orders.Element("Item") 
             .Element("Promotion") 
             .Element("Component") 
             .Element("Amount") 
             .Value, 
      //This should return me the Principal Currency 
      ItemDiscountCurrency = orders.Element("Item") 
             .Element("Promotion") 
             .Element("Component") 
             .Element("Amount") 
             .Attribute("currency") 
             .Value, 

      //This should return me the Shipping Amount 
      ShipDiscountAmount = orders.Element("Item") 
             .Element("Promotion") 
             .Element("Component") 
             .Element("Amount") 
             .Value, 
      //This should return me the Shipping Currency       
      ShipDiscountCurrency = orders.Element("Item") 
             .Element("Promotion") 
             .Element("Component") 
             .Element("Amount") 
             .Attribute("currency") 
             .Value, 
     }; 

我寫的代碼不正確。它現在返回所有物業的本金和貨幣。評論描述了爲了理解目的應該返回的內容。 該查詢應基本上返回我的價格和貨幣取決於<Type>節點<Component>節點下。不知道如何在這種情況下放置一個條件。

+1

我認爲你的班級結構留下了改進的空間。用'Value'和'Currency'屬性創建一個類'Amount'。用'Tax','ShipTax'等屬性創建一個'Item'類。 – Sjoerd

+1

你將不得不改變你的問題。我不知道你在問什麼,我懷疑其他人會有同樣的感受。 (你的代碼甚至不會編譯) –

+0

@Sjoerd - 我從我的應用程序中只能使用第三方應用程序獲取XML。 @Jeff Mercado - 對不起。讓我看看我該如何做得更好。 –

回答

0

這將幫助,如果你第一次發現含有Principal類型或Shipping型的第一要素,然後得到所需的值。我相信這就是你所追求的。

// using an XPATH will make this nicer to express 
var query = from report in xDoc.Descendants("OrderReport") 
      let principalAmount = report.XPathSelectElement("./*/*/Component[Type='Principal']/Amount") 
      let shippingAmount = report.XPathSelectElement("./*/*/Component[Type='Shipping']/Amount") 
      select new 
      { 
       ItemDiscountAmount = (decimal)principalAmount, 
       ItemDiscountCurrency = (string)principalAmount.Attribute("currency"), 
       ShipDiscountAmount = (decimal)shippingAmount, 
       ShipDiscountCurrency = (string)shippingAmount.Attribute("currency"), 
      }; 

只記得包括名稱空間System.Xml.XPath這個工作。

+0

太棒了。工作就像一個魅力:)非常感謝 –

0

,你只需要Where子句添加,

var q = from orders in xdoc1.Descendants("OrderReport") 
     join ItemPrices in xdoc1.Descendants 
     where orders.Component.Type == "Principal" 
     select new 
     { 
      OrderId = orders.Element("OrderID"), 
      City = orders.Element("City"), 
      CountryRegion = orders.Element("CountryCode"), 
      State = orders.Element("StateOrRegion"), 
      Street1 = orders.Element("AddressFieldOne"), 
      Telephone = orders.Element("PhoneNumber"), 
      ZipCode = orders.Element("PostalCode"), 
      Name = orders.Element("Name"), 
      OrderDate = orders.Element("OrderDate"), 
      ShipMethod = orders.Element("FulfillmentMethod"), 
      ItemCode = orders.Element("AmazonOrderItemCode"), 
      SKU = orders.Element("SKU"), 
      QtyOrdered = orders.Element(""), 
      ItemTaxAmount = orders.Element(""), 
      ItemTaxCurrency = orders.Element(""), 
      ItemShipTaxAmount = orders.Element(""), 
      ItemShipTaxCurrency = orders.Element(""), 
      ItemTotalAmount = orders.Element(""), 
      ItemTotalCurrency = orders.Element(""), 
      ItemUnitPrice = orders.Element(""), 
      ItemCommissionAmount = orders.Element(""), 
      ItemCommissionCurrency = orders.Element("") 
     }; 
+0

感謝亞歷山大, 但使用where子句我只會得到本金。我無法獲得單一選擇中的所有金額嗎?如果您看到我擁有「委託人」,「稅金」,「我的選擇」中的所有金額。 –

+0

你可以用AND運算符在where子句中擴展你。Principal && Tax && Ship –

+0

你現在可以檢查它。我編輯了這個問題,使其更加具體到問題領域。 –