синтаксический анализ XML через VBA [дубликат]

Собственно, это именно то, чего вы ожидаете. Давайте разложим, что здесь происходит:

Вы пишете

lst = [[1] * 4] * 3

Это эквивалентно:

lst1 = [1]*4
lst = [lst1]*3

Это означает, что lst - это список с 3 элемента, указывающие на lst1. Это означает, что две следующие строки эквивалентны:

lst[0][0] = 5
lst1[0] = 5

Поскольку lst[0] - это только lst1.

Чтобы получить желаемое поведение, вы можете использовать понимание списка:

lst = [ [1]*4 for n in xrange(3) ]

В этом случае выражение переоценивается для каждого n, что приводит к другому списку.

63
задан Andrea 4 August 2014 в 11:15
поделиться

4 ответа

Это немного сложный вопрос, но кажется, что наиболее прямым путем будет загрузка XML-документа или XML-строки через MSXML2.DOMDocument, который затем позволит вам получить доступ к узлам XML.

Вы можете найти больше на MSXML2.DOMDocument на следующих сайтах:

49
ответ дан rjzii 21 August 2018 в 03:24
поделиться

Обновить

Ниже приведена процедура анализа 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-объектов, встроенных в XML-документ VBA, было бы намного лучше. См. Обновления выше.

Original Response

Я знаю, что это очень старый пост, но я хотел поделиться своим простым решением с этим сложным вопросом. В основном я использовал основные строковые функции для доступа к данным xml.

Предполагается, что у вас есть некоторые данные xml (в переменной temp), которые были возвращены в функции VBA. Интересно, что можно также увидеть, как я связываюсь с веб-службой xml, чтобы получить значение. Функция, показанная на изображении, также принимает значение поиска, так как эту функцию Excel VBA можно получить изнутри ячейки, используя = FunctionName (value1, value2), чтобы возвращать значения через веб-службу в электронную таблицу.

sample function [/g1]


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)

67
ответ дан Macro Man 21 August 2018 в 03:24
поделиться
  • 1
    Когда я пытаюсь debug.print одной из этих точек, я получаю объектную переменную или с переменной блока не установлен. Какие-либо предложения? – wizlog 2 August 2017 в 17:42
  • 2
    Некоторые вопросы: почему путь // root, а не / root? И если у меня есть один человек в моем oSeqNode, как я подбираю все & lt; телефон & gt; 's внутри только этого человека ? – Maury Markowitz 29 March 2018 в 19:04

Часто проще анализировать без VBA, когда вы не хотите включать макросы. Это можно сделать с помощью функции замены. Введите начальный и конечный узлы в ячейки B1 и C1.

Cell A1: {your XML here}
Cell B1: <X>
Cell C1: </X>
Cell D1: =REPLACE(A1,1,FIND(A2,A1)+LEN(A2)-1,"")
Cell E1: =REPLACE(A4,FIND(A3,A4),LEN(A4)-FIND(A3,A4)+1,"")

И строка результата E1 будет иметь ваше проанализированное значение:

Cell A1: {your XML here}
Cell B1: <X>
Cell C1: </X>
Cell D1: 24.365<X><Y>78.68</Y></PointN>
Cell E1: 24.365
0
ответ дан TJ Wilkinson 21 August 2018 в 03:24
поделиться
67
ответ дан Sam 31 October 2018 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: