2010-06-14 5 views
0

Je suis en train d'analyser un document XML à distance (d'Amazon AWS):Document XML Parse

<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-03-31"> 
     <OperationRequest> 
     <RequestId>011d32c5-4fab-4c7d-8785-ac48b9bda6da</RequestId> 
     <Arguments> 
      <Argument Name="Condition" Value="New"></Argument> 
      <Argument Name="Operation" Value="ItemLookup"></Argument> 
      <Argument Name="Service" Value="AWSECommerceService"></Argument> 
      <Argument Name="Signature" Value="73l8oLJhITTsWtHxsdrS3BMKsdf01n37PE8u/XCbsJM="></Argument> 
      <Argument Name="MerchantId" Value="Amazon"></Argument> 
      <Argument Name="Version" Value="2009-03-31"></Argument> 
      <Argument Name="ItemId" Value="603084260089"></Argument> 
      <Argument Name="IdType" Value="UPC"></Argument> 
      <Argument Name="AWSAccessKeyId" Value="[myAccessKey]"></Argument> 
      <Argument Name="Timestamp" Value="2010-06-14T15:03:27Z"></Argument> 
      <Argument Name="ResponseGroup" Value="OfferSummary,ItemAttributes"></Argument> 
      <Argument Name="SearchIndex" Value="All"></Argument> 
     </Arguments> 
     <RequestProcessingTime>0.0318510000000000</RequestProcessingTime> 
     </OperationRequest> 
     <Items> 
     <Request> 
      <IsValid>True</IsValid> 
      <ItemLookupRequest> 
      <Condition>New</Condition> 
      <DeliveryMethod>Ship</DeliveryMethod> 
      <IdType>UPC</IdType> 
      <MerchantId>Amazon</MerchantId> 
      <OfferPage>1</OfferPage> 
      <ItemId>603084260089</ItemId> 
      <ResponseGroup>OfferSummary</ResponseGroup> 
      <ResponseGroup>ItemAttributes</ResponseGroup> 
      <ReviewPage>1</ReviewPage> 
      <ReviewSort>-SubmissionDate</ReviewSort> 
      <SearchIndex>All</SearchIndex> 
      <VariationPage>All</VariationPage> 
      </ItemLookupRequest> 
     </Request> 
     <Item> 
      <ASIN>B0000UTUNI</ASIN> 
      <DetailPageURL>http://www.amazon.com/Garnier-Fructis-Fortifying-Conditioner-Minute/dp/B0000UTUNI%3FSubscriptionId%3DAKIAIYPTKHCWTRWWPWBQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB0000UTUNI</DetailPageURL> 
      <ItemLinks> 
      <ItemLink> 
       <Description>Technical Details</Description> 
       <URL>http://www.amazon.com/Garnier-Fructis-Fortifying-Conditioner-Minute/dp/tech-data/B0000UTUNI%3FSubscriptionId%3DAKIAIYPTKHCWTRWWPWBQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0000UTUNI</URL> 
      </ItemLink> 
      <ItemLink> 
       <Description>Add To Baby Registry</Description> 
       <URL>http://www.amazon.com/gp/registry/baby/add-item.html%3Fasin.0%3DB0000UTUNI%26SubscriptionId%3DAKIAIYPTKHCWTRWWPWBQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0000UTUNI</URL> 
      </ItemLink> 
      <ItemLink> 
       <Description>Add To Wedding Registry</Description> 
       <URL>http://www.amazon.com/gp/registry/wedding/add-item.html%3Fasin.0%3DB0000UTUNI%26SubscriptionId%3DAKIAIYPTKHCWTRWWPWBQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0000UTUNI</URL> 
      </ItemLink> 
      <ItemLink> 
       <Description>Add To Wishlist</Description> 
       <URL>http://www.amazon.com/gp/registry/wishlist/add-item.html%3Fasin.0%3DB0000UTUNI%26SubscriptionId%3DAKIAIYPTKHCWTRWWPWBQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0000UTUNI</URL> 
      </ItemLink> 
      <ItemLink> 
       <Description>Tell A Friend</Description> 
       <URL>http://www.amazon.com/gp/pdp/taf/B0000UTUNI%3FSubscriptionId%3DAKIAIYPTKHCWTRWWPWBQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0000UTUNI</URL> 
      </ItemLink> 
      <ItemLink> 
       <Description>All Customer Reviews</Description> 
       <URL>http://www.amazon.com/review/product/B0000UTUNI%3FSubscriptionId%3DAKIAIYPTKHCWTRWWPWBQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0000UTUNI</URL> 
      </ItemLink> 
      <ItemLink> 
       <Description>All Offers</Description> 
       <URL>http://www.amazon.com/gp/offer-listing/B0000UTUNI%3FSubscriptionId%3DAKIAIYPTKHCWTRWWPWBQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB0000UTUNI</URL> 
      </ItemLink> 
      </ItemLinks> 
      <ItemAttributes> 
      <Binding>Health and Beauty</Binding> 
      <Brand>Garnier</Brand> 
      <EAN>0603084260089</EAN> 
      <Feature>Helps restore strength and shine</Feature> 
      <Feature>Penetrates deep to nourish, repair and rejuvenate</Feature> 
      <Feature>Makes hair softer and more manageable without weighing it down</Feature> 
      <ItemDimensions> 
       <Weight Units="hundredths-pounds">40</Weight> 
      </ItemDimensions> 
      <Label>Garnier</Label> 
      <ListPrice> 
       <Amount>419</Amount> 
       <CurrencyCode>USD</CurrencyCode> 
       <FormattedPrice>$4.19</FormattedPrice> 
      </ListPrice> 
      <Manufacturer>Garnier</Manufacturer> 
      <NumberOfItems>1</NumberOfItems> 
      <ProductGroup>Health and Beauty</ProductGroup> 
      <ProductTypeName>ABIS_DRUGSTORE</ProductTypeName> 
      <Publisher>Garnier</Publisher> 
      <Size>5.0 oz</Size> 
      <Studio>Garnier</Studio> 
      <Title>Garnier Fructis Fortifying Fortifying Deep Conditioner, 3 Minute Masque - 5 oz</Title> 
      <UPC>603084260089</UPC> 
      </ItemAttributes> 
      <OfferSummary> 
      <LowestNewPrice> 
       <Amount>229</Amount> 
       <CurrencyCode>USD</CurrencyCode> 
       <FormattedPrice>$2.29</FormattedPrice> 
      </LowestNewPrice> 
      <TotalNew>7</TotalNew> 
      <TotalUsed>0</TotalUsed> 
      <TotalCollectible>0</TotalCollectible> 
      <TotalRefurbished>0</TotalRefurbished> 
      </OfferSummary> 
     </Item> 
     </Items> 
    </ItemLookupResponse> 

Je suis en train d'extraire des données à partir du flux XML à l'aide XPathDocument, mais pas de chance:

WebRequest request = HttpWebRequest.Create(url); 
     WebResponse response = request.GetResponse(); 
     //XmlDocument doc = new XmlDocument(); 

     XPathDocument Doc = new XPathDocument(response.GetResponseStream()); 
     XPathNavigator nav = Doc.CreateNavigator(); 
     XPathNodeIterator ListPrice = nav.Select("/ItemLookupResponse/Items/Item/ItemAttributes/ListPrice"); 
     foreach (XPathNavigator node in ListPrice) 
     { 
      Response.Write(node.GetAttribute("Amount", NAMESPACE)); 
     } 

Qu'est-ce qui me manque? Merci d'avance!!

EDIT J'utilise .net 3.5

+0

Quelle erreur voyez-vous ?! – psmears

+0

Aucune erreur, mais aucune donnée. – Neil

Répondre

4

Montant n'est pas un attribut, il est un élément enfant. La requête xpath correspondante est /ItemLookupResponse/Items/Item/ItemAttributes/ListPrice/Amount.

XPathNodeIterator ListPrice = nav.Select("/ItemLookupResponse/Items/Item/ItemAttributes/ListPrice/Amount"); 

Response.Write(ListPrice.Value); 
+0

Je n'ai pas jeté ensemble un harnais de test, donc je ne sais pas si cela s'applique, mais XPath est aussi très pointilleux sur les espaces de noms. Je ne sais pas si XPathNavigator gère automagiquement un espace de noms par défaut comme prévu dans ce code. – Toby

+0

Le xpath est correct (http://xpathvisualizer.codeplex.com/ est un excellent outil pour le tester). Je dois admettre cependant, je ne suis pas très dans les détails plus profonds de xml. – Femaref

+0

Cela ne fonctionnera pas, car vous ne tenez pas compte de l'espace de noms XML sur le document! –

2

Vous ne prêtez pas attention à l'espace de noms XML (s) dans le document XML (et ne sont les autres réponses fournies):

<ItemLookupResponse 
    xmlns="http://webservices.amazon.com/AWSECommerceService/2009-03-31"> 

Vous devez en tenir compte!

XPathDocument Doc = new XPathDocument(@"D:\amazon.xml"); 

XPathNavigator nav = Doc.CreateNavigator(); 

// add a XML namespace manager - pick any prefix you want   
XmlNamespaceManager mngr = new XmlNamespaceManager(nav.NameTable); 
mngr.AddNamespace("az", "http://webservices.amazon.com/AWSECommerceService/2009-03-31"); 

// use that XML namespace prefix to select 
var ListPrice = nav.Select("/az:ItemLookupResponse/az:Items/az:Item/az:ItemAttributes/az:ListPrice", mngr); 

MISE À JOUR: si vous voulez explorer les nœuds enfants en dessous de votre noeud ListPrice, vous pouvez faire quelque chose comme ceci:

var curr = ListPrice.Current; 

if(ListPrice.MoveNext()) 
{ 
    var lpc = ListPrice.Current; 

    if(lpc.MoveToFirstChild()) 
    { 
     var node = lpc.Name + "/" + lpc.Value; 

     while(lpc.MoveToNext()) 
     { 
      node = lpc.Name + "/" + lpc.Value; 
     } 
    } 
} 

à itérer tous les nœuds enfants sous <ListPrice> et d'obtenir leur nom et la valeur.

+0

Quand je mets un point d'arrêt sur var ListPrice - new nav ...... et que je le parcours, je peux voir les données dont j'ai besoin dans la collection de vues de résultats - comment l'obtenir? – Neil

+0

@Neil: mis à jour ma réponse montrant comment accéder aux détails .... –