Обновление
Процедура, представленная ниже, дает пример синтаксического анализа XML с VBA с использованием объектов XML DOM. Код основан на руководстве для начинающих XML DOM .
Public Sub LoadDocument()
Dim xDoc As MSXML.DOMDocument
Set xDoc = New MSXML.DOMDocument
xDoc.validateOnParse = False
If xDoc.Load("C:\My Documents\sample.xml") Then
' The document loaded successfully.
' Now do something intersting.
DisplayNode xDoc.childNodes, 0
Else
' The document failed to load.
' See the previous listing for error information.
End If
End Sub
Public Sub DisplayNode(ByRef Nodes As MSXML.IXMLDOMNodeList, _
ByVal Indent As Integer)
Dim xNode As MSXML.IXMLDOMNode
Indent = Indent + 2
For Each xNode In Nodes
If xNode.nodeType = NODE_TEXT Then
Debug.Print Space$(Indent) & xNode.parentNode.nodeName & _
":" & xNode.nodeValue
End If
If xNode.hasChildNodes Then
DisplayNode xNode.childNodes, Indent
End If
Next xNode
End Sub
Nota Bene - Этот первоначальный ответ показывает простейшую возможную вещь, которую я мог себе представить (в то время, когда я работал над очень конкретной проблемой).
Естественно, использование средств XML, встроенных в VBA XML Dom, будет
намного лучше. См. Обновления выше.
Оригинальный ответ
Я знаю, что это очень старая статья, но я хотел поделиться своим простым решением этого сложного вопроса. Прежде всего я использовал основные строковые функции для доступа к данным XML.
Предполагается, что у вас есть некоторые данные XML (в переменной temp), которые были возвращены в функции VBA. Интересно, что можно также увидеть, как я связываюсь с веб-службой XML для получения значения. Функция, показанная на рисунке, также принимает искомое значение, потому что к этой функции Excel VBA можно обратиться изнутри ячейки, используя = FunctionName (value1, value2) для возврата значений через веб-службу в электронную таблицу.
openTag = "<" & tagValue & ">"
closeTag = "< /" & tagValue & ">"
' Locate the position of the enclosing tags
startPos = InStr(1, temp, openTag)
endPos = InStr(1, temp, closeTag)
startTagPos = InStr(startPos, temp, ">") + 1
' Parse xml for returned value
Data = Mid(temp, startTagPos, endPos - startTagPos)