2014-12-25 5 views
2

Свойство DocumentElement и SelectSingleNode продолжают ничего не возвращать, я проверил, что xml загружается правильно, проблема, похоже, лежит в синтаксисе xml. В xml нет пространств имен, поэтому его не нужно устанавливать.Почему Msxml DocumentElement/SelectSingleNode ничего не возвращает?

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

+0

Код функции '' 'ParseWord (...)' '' отлично работает. но как выглядит функция '' 'CreateFile (...)' ''? Не могли бы вы также опубликовать этот код? Созданный файл должен использовать UTF-8, есть специальный знак в тексте xml, это '' 'R''' в круге после слова« Наследие ». – dee

ответ

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 
Смежные вопросы