2015-06-11 2 views
0

Я пытаюсь проанализировать данные из XML-ответа API рекламы Amazon Product Advertising API. Я использую DOMDocument в excel vba для загрузки XML-документа и анализа resposne. Это как ответ XML выглядит следующим образом:Устранение элементов из XML API AMAZON в Excel VBA

<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"> 
<OperationRequest> 
<RequestId>fd9f1314-29932-45a0-8fc4-c999276425f4</RequestId> 
<RequestProcessingTime>0.0265880000000000</RequestProcessingTime> 
</OperationRequest> 
<Items> 
<Request> 
<IsValid>True</IsValid> 
<ItemLookupRequest> 
<IdType>ASIN</IdType> 
<ItemId>B00CSDILZI</ItemId> 
<ResponseGroup>Offers</ResponseGroup> 
<VariationPage>All</VariationPage> 
</ItemLookupRequest> 
</Request> 
<Item> 
<ASIN>B00CSDILZI</ASIN> 
<OfferSummary> 
<LowestNewPrice> 
<Amount>26761</Amount> 
<CurrencyCode>USD</CurrencyCode> 
<FormattedPrice>$267.61</FormattedPrice> 
</LowestNewPrice> 
<TotalNew>22</TotalNew> 
<TotalUsed>0</TotalUsed> 
<TotalCollectible>0</TotalCollectible> 
<TotalRefurbished>0</TotalRefurbished> 
</OfferSummary> 
<Offers> 
<TotalOffers>1</TotalOffers> 
<TotalOfferPages>1</TotalOfferPages> 
MoreOffersUrl>...</MoreOffersUrl> 
<Offer> 
<OfferAttributes>...</OfferAttributes> 
<OfferListing> 
<OfferListingId>...</OfferListingId> 
<Price> 
<Amount>26761</Amount> 
<CurrencyCode>USD</CurrencyCode> 
<FormattedPrice>$267.61</FormattedPrice> 
</Price> 
<AmountSaved> 
<Amount>23841</Amount> 
<CurrencyCode>USD</CurrencyCode> 
<FormattedPrice>$238.41</FormattedPrice> 
</AmountSaved> 
<PercentageSaved>47</PercentageSaved> 
<Availability>Usually ships in 1-2 business days</Availability> 
<AvailabilityAttributes> 
<AvailabilityType>now</AvailabilityType> 
<MinimumHours>24</MinimumHours> 
<MaximumHours>48</MaximumHours> 
</AvailabilityAttributes> 
<IsEligibleForSuperSaverShipping>0</IsEligibleForSuperSaverShipping> 
</OfferListing> 
</Offer> 
</Offers> 
</Item> 
</Items> 
</ItemLookupResponse> 

Я пытаюсь перебрать весь XML и извлечь детали элементов, как ASIN, FormattedPrice, низкие цены и т.д. на листе Excel. Это, как я попробовал:

Sub subReadXMLStream() 

Dim xmlDoc As MSXML2.DOMDocument 
Dim xEmpDetails As MSXML2.IXMLDOMNode 
Dim xParent As MSXML2.IXMLDOMNode 
Dim xChild As MSXML2.IXMLDOMNode 
Dim Col, Row As Integer 

Set xmlDoc = New MSXML2.DOMDocument 
xmlDoc.async = False 
xmlDoc.validateOnParse = False 
' use XML string to create a DOM, on error show error message 
If Not xmlDoc.Load("E:\web\offersumm.xml") Then 
    Err.Raise xmlDoc.parseError.ErrorCode, , xmlDoc.parseError.reason 
End If 

Set xEmpDetails = xmlDoc.DocumentElement 
Set xParent = xEmpDetails.FirstChild 
Row = 1 
Col = 1 

Dim xmlNodeList As IXMLDOMNodeList 

Set xmlNodeList = xmlDoc.SelectNodes("//Item") 
For Each xParent In xmlNodeList 
    For Each xChild In xParent.ChildNodes 
     Worksheets("Sheet2").Cells(Row, Col).Value = xChild.Text 
     Debug.Print Row & " - "; Col & " - " & xChild.Text 
     Col = Col + 1 
    Next xChild 
    Row = Row + 1 
    Col = 1 
Next xParent 

End Sub

Однако это печать весь текст в тегах в качестве как

1 - 1 - B00CSDILZI 
1 - 2 - 26761 USD $267.61 22 0 0 0 
1 - 3 - 1 1 ... ... ... 26761 USD $267.61 23841 USD $238.41 47 Usually ships in 1-2 business days now 24 48 0 

Но то, что я пытаюсь достичь получить элементы по его имя тега и печать затем в ячейках. Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?

+0

Как же лист Excel выглядит? В вашем коде с данным XML первый 'xChild' является элементом' ASIN'. Это просто, хорошо. Но второй 'xChild' является элементом' OfferSummary', который является сложным элементом. У этого есть своя детская. Его первым дочерним элементом является элемент «LowestNewPrice», который также является сложным элементом. Итак, как эта сложная структура будет помещена в лист Excel? –

+0

На самом деле я не пытаюсь распечатать каждый элемент. Меня интересуют только несколько параметров, таких как ASIN, FormattedPrice, Доступность и т. Д. И печатать их в столбцах excel. Именно поэтому я искал способ индивидуального доступа к элементам внутри тегов. –

ответ

0

Следующий код получает ASIN, Offers/Offer[0]/OfferListing/Price/FormattedPrice и Offers/Offer[0]/OfferListing/Availability для каждого элемента Item в формате XML. Он предполагает наличие нескольких Offer элементов в Offers, но только один OfferListing в каждом Offer. Если есть несколько элементов Offer, он будет первым.

Синтаксис, используемый в SelectNodes и SelectSingleNode is XPath, см. http://en.wikipedia.org/wiki/XPath. Для MSXML2.DOMDocument см https://msdn.microsoft.com/en-us/library/aa923288.aspx

Sub subReadXMLStream() 

Dim xmlDoc As MSXML2.DOMDocument 
Dim xEmpDetails As MSXML2.IXMLDOMNode 
Dim xParent As MSXML2.IXMLDOMNode 
Dim xChild As MSXML2.IXMLDOMNode 
Dim lCol, lRow As Long 

Set xmlDoc = New MSXML2.DOMDocument 
xmlDoc.async = False 
xmlDoc.validateOnParse = False 

If Not xmlDoc.Load("P:\offersumm.xml") Then 
    Err.Raise xmlDoc.parseError.ErrorCode, , xmlDoc.parseError.reason 
End If 

Set xEmpDetails = xmlDoc.DocumentElement 
Set xParent = xEmpDetails.FirstChild 
lRow = 1 
lCol = 1 

Dim xmlNodeList As IXMLDOMNodeList 

Dim sFormattedPrice As String, sAvailability As String 

Set xmlNodeList = xmlDoc.SelectNodes("//Item") 
For Each xParent In xmlNodeList 
    For Each xChild In xParent.ChildNodes 
     If xChild.nodeName = "ASIN" Then 
      Worksheets("Sheet2").Cells(lRow, lCol).Value = xChild.Text 
      lCol = lCol + 1 
     ElseIf xChild.nodeName = "Offers" Then 
      sFormattedPrice = xChild.SelectSingleNode("Offer[0]/OfferListing/Price/FormattedPrice").Text 
      Worksheets("Sheet2").Cells(lRow, lCol).Value = sFormattedPrice 
      lCol = lCol + 1 
      sAvailability = xChild.SelectSingleNode("Offer[0]/OfferListing/Availability").Text 
      Worksheets("Sheet2").Cells(lRow, lCol).Value = sAvailability 
      lCol = lCol + 1 
     End If 
    Next xChild 
    lRow = lRow + 1 
    lCol = 1 
Next xParent 

End Sub 
+0

Благодарим за руководство! –

Смежные вопросы