2010-01-29 7 views
3

J'ai ce XML que je veux être capable de retirer le numéro de commande, le (s) article (s), la quantité, le prix de l'article (principal, taxe, etc.). Voici le XML (voir ci-dessous). Ce que j'ai des problèmes avec est le ItemPrice. Avec cela vous pouvez 0 à plusieurs composantes de prix, impôt, principal etc. Comment puis-je les sortir dans une sortie de ligne unique?Aide en utilisant Linq pour interroger XML

Maintenant, je peux obtenir orderNumber, ItemNumber, Qty ... mais quand je tire le prix, je reçois une ligne pour la taxe et prinicpal.

Une autre question est ce qui se passe si dans certains cas, la taxe n'est pas là? Je vais obtenir une référence nulle, n'est-ce pas? Je veux essayer et manipuler ceux et remplacer juste 0. Toutes les suggestions sont grandement appréciées.

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> 

Mon code:

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

      } 

Répondre

0

Faisable, il est vrai un peu maladroit. J'utiliserais probablement une paire de variables laissées par les sous-composants que je veux (en supposant que vous voulez seulement ces deux valeurs spécifiques).

Modifié pour supprimer les locations en raison d'un problème avec la clause Where. Je ne pense il y a un problème avec le Où dans la sélection, mais il peut avoir le même problème.

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

Jacob, serait-il préférable d'utiliser une méthode différente? Je ne suis pas coincé sur Linq, je pensais juste que je devrais essayer d'en profiter. Merci pour le conseil que je vais vérifier. – scarpacci

+0

Lorsque je l'essaie, les variables Où dans les let ne semblent pas être reconnues. Des pensées? – scarpacci

+0

Intéressant. Je me demande si le Où s'inscrirait plus tard. Je ne suis pas dans un endroit où je peux le tester jusqu'à demain, mais je vais éditer quelque chose. Ce sera un peu complexe, cependant. –