为什么Msxml DocumentElement / SelectSingleNode什么都不返回?

时间:2014-12-25 07:14:46

标签: xml excel vba excel-vba

DocumentElement属性和SelectSingleNode一直没有返回,我已经验证了xml正确加载,问题似乎在于xml解析器。 xml没有任何名称空间,因此不需要设置它。

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来源: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>

createFile函数来自:

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

1 个答案:

答案 0 :(得分:1)

从字符串加载xml对我有用。(可能是字符串编码问题?)

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