Собственно, это именно то, чего вы ожидаете. Давайте разложим, что здесь происходит:
Вы пишете
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, что приводит к другому списку.
Это немного сложный вопрос, но кажется, что наиболее прямым путем будет загрузка XML-документа или XML-строки через MSXML2.DOMDocument, который затем позволит вам получить доступ к узлам XML.
Вы можете найти больше на MSXML2.DOMDocument на следующих сайтах:
Обновить
Ниже приведена процедура анализа 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), чтобы возвращать значения через веб-службу в электронную таблицу.
[/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)
Часто проще анализировать без 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