2016-07-04 11 views
0

: Ich bin XML mit VBA zu verwenden und ich versuche, XML-Antworten bilden die eBay-API wie diese zu analysieren:DOMDocument.SelectSingleNode Verwendung mit XML-Namespace zurückkehrend immer Null VBA

<?xml version="1.0"?> 
<GetSingleItemResponse xmlns="urn:ebay:apis:eBLBaseComponents"> 
<Timestamp>2016-07-04T06:24:28.969Z</Timestamp> 
<Ack>Success</Ack> 
<Build>E963_CORE_APILW_17911290_R1</Build> 
<Version>963</Version> 
<Item> 
    <ItemID>232001428891</ItemID> 
    <EndTime>2016-07-13T22:06:14.000Z</EndTime> 
    <ViewItemURLForNaturalSearch>http://www.ebay.com/itm/WW2-Australian-P37-Entrenching-Tool-Cover-/232001428891</ViewItemURLForNaturalSearch> 
    <ListingType>Chinese</ListingType> 
    <Location>Pambula, New South Wales</Location> 
</Item> 
</GetSingleItemResponse> 

Ich bin mit dem folgenden Code, um Knoten aus dem XML zu ziehen, was für andere zu funktionieren scheint, aber für mich geben die oDoc.SelectSingleNode Zeilen immer Null zurück. Ich habe versucht, den XML-Namespace manuell zu entfernen und diesen mit XML v.4.0-Objekten zurück in die Objekte zu geben, und habe fast jede XPath-Kombination ausprobiert, die mir einfällt. Der VBA-Code, den ich in einem eigenen Modul verwende ist:

Public Sub GeteBayItem() 

'create the xml string 
Dim itemXML As String 

'Populate itemXML String with necessary values 
'................. 

'the http connection 
Dim httpCnct As XMLHTTP60 
Set httpCnct = New XMLHTTP60 

'using POST synchronous call 
httpCnct.Open "POST", "http://open.api.ebay.com/shopping?", False 

'set the headers 
'......... 

Dim xmlDoc As FreeThreadedDOMDocument60 
Set xmlDoc = New FreeThreadedDOMDocument60 

xmlDoc.async = False 

xmlDoc.LoadXML itemXML 

'Make the call 
httpCnct.send xmlDoc 

Dim oNode As IXMLDOMNode 
Dim oNode1 As IXMLDOMNode 
Dim oDoc As DOMDocument60 

Set oDoc = httpCnct.responseXML 

Call oDoc.SetProperty("SelectionNamespaces", "xmlns:eBay='urn:ebay:eBLBaseComponents'") 
'Debug.Print oDoc.XML 
'Declaring a XML Doc 

'Get the Item Number 
Set oNode = oDoc.SelectSingleNode("/eBay:GetSingleItemResponse/eBay:Item/eBay:ItemID") 
'Get the title 
Set oNode1 = oDoc.SelectSingleNode("/eBay:GetSingleItemResponse/eBay:Item/eBay:Title") 

'Set oNode = oDoc.SelectSingleNode(“/GetItemResponse”) 

MsgBox (oNode.Text) 
MsgBox (oNode1.Text) 

Set oNode = Nothing 
Set oNode1 = Nothing 
Set oDoc = Nothing 
End Sub 

Der Code, um die Informationen aus den eBay-Servern ziehen funktioniert gut die einzigen Probleme Ich habe versucht, die Antwortwerte aus dem XML zu isolieren, aber ich eingeschlossen, falls das Problem irgendwo dort liegt. Letztendlich versuche ich nur den Wert eines Knotens wie ItemID = 232001428891 zu erhalten.

Vielen Dank im Voraus,

+0

Wo ist das Namespacepräfix 'eBay' im XML-Dokument? – Parfait

+0

@Parfait Ups tut mir leid, ich habe vergessen, es in das XML aufzunehmen. Es ist jetzt in der zweiten Zeile. –

Antwort

0

Einfache Tippfehler wie der Namespace in VBA erklärt nicht auf XML ausrichten, speziell Sie die apis verpassen:

<GetSingleItemResponse xmlns="urn:ebay:apis:eBLBaseComponents"> 
oDoc.SetProperty("SelectionNamespaces", "xmlns:eBay='urn:ebay:eBLBaseComponents'") 
entsprechend

Wechsel:

oDoc.SetProperty("SelectionNamespaces", "xmlns:eBay='urn:ebay:apis:eBLBaseComponents'") 

auch zweiten .SelectSingleNode() zeigt nicht auf den vorhandenen Pfad in geposteten XML, nämlich kein <Title> Element.

+0

Danke. Lehrt mich, den Code von jemand anderem zu kopieren, ohne ihn wirklich genau zu betrachten .... –

-1

Versuchen Sie Xml LINQ. Ich verwendete Load (Dateiname) Sie können jedoch verwenden Parse (String)

Imports System.Xml 
Imports System.Xml.Linq 
Module Module1 
    Const FILENAME As String = "c:\temp\test.xml" 
    Sub Main() 
     Dim doc As XDocument = XDocument.Load(FILENAME) 

     Dim timestamp As DateTime = CType(doc.Descendants("Timestamp").FirstOrDefault(), DateTime) 
     Dim ack As String = CType(doc.Descendants("Ack").FirstOrDefault(), String) 
     Dim build As String = CType(doc.Descendants("Build").FirstOrDefault(), String) 
     Dim version As String = CType(doc.Descendants("Version").FirstOrDefault(), String) 

     Dim itemID As String = CType(doc.Descendants("ItemID").FirstOrDefault(), String) 
     Dim endTime As DateTime = CType(doc.Descendants("EndTime").FirstOrDefault(), DateTime) 
     Dim viewItemURLForNaturalSearch As String = CType(doc.Descendants("ViewItemURLForNaturalSearch").FirstOrDefault(), String) 
     Dim listingType As String = CType(doc.Descendants("ListingType").FirstOrDefault(), String) 
     Dim location As String = CType(doc.Descendants("Location").FirstOrDefault(), String) 

    End Sub 

End Module 
+0

Ich bin vielleicht ignorant, aber ist das VBA? Entschuldigung, wenn ich das in meiner Frage nicht klargestellt habe. –

+0

Tut mir leid, es ist VBnet. – jdweng