user3551708
user3551708

Reputation: 943

why does Msxml DocumentElement/SelectSingleNode returns nothing?

The DocumentElement property and the SelectSingleNode keep on returning nothing, I have verified that the xml loads correctly, the problem seems to lie in the xml parser. The xml does not have any namespaces so it shouldn't needed to be set.

Private Function ParseWord(word As String) As String
    Dim tempFile As String
    tempFile = Environ("temp") & "\" & "temporaryWord" & ".xml"
    Call CreateFile(tempFile, word)

    Dim xmlDoc As Object
    Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")

    With xmlDoc
     .async = False
     .setProperty "SelectionLanguage", "XPath"
     .validateOnParse = False
     .Load tempFile
     '.setProperty "SelectionNamespaces", ""
     '.Namespaces = False
    End With

    Dim xmlElement As Object
    Set xmlElement = xmlDoc.DocumentElement

    If xmlElement Is Nothing Then
        MsgBox "error in element"
        Exit Function
    End If

    Dim nodeXML As Object
    Set nodeXML = xmlElement.SelectSingleNode("/definitions/definition/text")

    If nodeXML Is Nothing Then
        MsgBox "error"
    Else
        MsgBox nodeXML.Text
        ParseWord = nodeXML.Text
    End If

End Function

xml source :http://api.wordnik.com/v4/word.xml/intransigent/definitions?limit=200&includeRelated=true&useCanonical=true&includeTags=false&api_key=a2a73e7b926c924fad7001ca3111acd55af2ffabf50eb4ae5

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><definitions><definition sequence="0">        <textProns/><sourceDictionary>ahd-legacy</sourceDictionary><exampleUses/><relatedWords/><labels/>   <citations/><word>intransigent</word><attributionText>from The American Heritage® Dictionary of the English Language, 4th Edition</attributionText><text>Refusing to moderate a position, especially an extreme position; uncompromising.</text><partOfSpeech>adjective</partOfSpeech><score>0.0</score></definition></definitions>

The createFile function is from here:

http://www.jpsoftwaretech.com/vba/msxml-object-library-routines/#createfile

Upvotes: 2

Views: 1982

Answers (2)

V&#237;t Jirman
V&#237;t Jirman

Reputation: 11

I had a similar problem. It was caused by namespaces, and can be fixed as follows...

XMLDoc.SetProperty "SelectionNamespaces", "xmlns:dummy=""http://www.w3.org/2005/Atom"""
Set Entries = XMLDoc.DocumentElement.SelectNodes(".//dummy:entry")
'Set Entries = XMLDoc.DocumentElement.SelectNodes(".//entry") 'DOES NOT WORK

From here: https://vbaplanet.com/xml.php

Upvotes: 0

Siphor
Siphor

Reputation: 2534

Loading the xml from a string works for me.(maybe an string encoding issue?)

Sub test()
    'Cell A1 contains the xml
    ParseXML (Range("A1"))
End Sub
Private Function ParseXML(xmlString As String) As String
    Dim tempFile As String

    Dim xmlDoc As Object
    Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")

    With xmlDoc
     .async = False
     .setProperty "SelectionLanguage", "XPath"
     .validateOnParse = False
     .LoadXML xmlString
     '.setProperty "SelectionNamespaces", ""
     '.Namespaces = False
    End With

    Dim xmlElement As Object
    Set xmlElement = xmlDoc.DocumentElement

    If xmlElement Is Nothing Then
        MsgBox "error in element"
        Exit Function
    End If

    Dim nodeXML As Object
    Set nodeXML = xmlElement.SelectSingleNode("/definitions/definition/text")

    If nodeXML Is Nothing Then
        MsgBox "error"
    Else
        MsgBox nodeXML.Text
        ParseXML = nodeXML.Text
    End If

End Function

Upvotes: 1

Related Questions