VBA读取具有相似名称的XML节点
我有一个XML,它看起来像VBA读取具有相似名称的XML节点,vba,xml-parsing,Vba,Xml Parsing,我有一个XML,它看起来像 <view> <fieldlist> <viewField> <formatterParameterMap> <entry> <string> </string> <string </string> </entry> </formatterParameterMap> </viewField> </fi
<view>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string> </string>
<string </string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<view>
我正在努力让它工作。真诚地感谢任何帮助为了在第二级使用getElementsByTagName,需要将DomNode声明为IXMLDOMELENT,而不是IXMLDOMNode 此外,您的xml是不可靠的-您的第二个视图标记应该关闭,并且您的一个字符串标记缺少“>”-请参阅代码下面格式正确的示例xml
Private Sub CommandButton1_Click()
Dim Init As Integer
Dim xmlDoc As New DOMDocument
Dim DomNode As IXMLDOMElement
Dim childNode As IXMLDOMNode
Init = 7
Sheets("Views").Select
'XML_Path = Cells(3, "F").Value
'Set xmlDoc = CreateObject("MSXML2.DOMDocument")
'MsgBox XML_Path
xmlDoc.Load ("C:\DRIVE\BMC\DSS\01_DSS_NExT\SP_1\IN APP\Automation_YF\Total_YF_XML.xml")
'Assemble the qualified node list and walk it
For Each DomNode In xmlDoc.getElementsByTagName("entry")
' Assemble the qualified node list, walk it and output their text
For Each childNode In DomNode.getElementsByTagName("string")
ActiveSheet.Cells(Init, 1).Value2 = childNode.Text
Init = Init + 1
Next childNode
Next DomNode
End Sub
编辑:在IXMLDOMNode
上使用SelectNodes
的替代解决方案,如OP所述
Private Sub CommandButton1_Click()
Dim Init As Integer
Dim xmlDoc As New DOMDocument
Dim DomNode As IXMLDOMNode
Dim childNode As IXMLDOMNode
Init = 7
Sheets("Views").Select
'XML_Path = Cells(3, "F").Value
'Set xmlDoc = CreateObject("MSXML2.DOMDocument")
'MsgBox XML_Path
xmlDoc.Load ("C:\DRIVE\BMC\DSS\01_DSS_NExT\SP_1\IN APP\Automation_YF\Total_YF_XML.xml")
'Assemble the qualified node list and walk it
For Each DomNode In xmlDoc.getElementsByTagName("entry")
' Assemble the qualified node list, walk it and output their text
For Each childNode In DomNode.SelectNodes("string")
ActiveSheet.Cells(Init, 1).Value2 = childNode.Text
Init = Init + 1
Next childNode
Next DomNode
End Sub
正确的XML示例
<?xml version="1.0" encoding="utf-8"?>
<view>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>8888</string>
<string>99999</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>22222222</string>
<string>2323232323</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>36363636</string>
<string>3737373737</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>50505050</string>
<string>5151515151</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>64646464</string>
<string>6565656565</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>78787878</string>
<string>7979797979</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
</view>
8888
99999
22222222
2323232323
36363636
3737373737
50505050
5151515151
64646464
6565656565
78787878
7979797979
对于DomNode中的每个childNode.childNodes?谢谢您的时间,但很抱歉我不明白您的建议。DOM包含一个名为childNodes的元素属性,该属性返回元素的子节点的节点列表。用它来获取DomNode中字符串元素的集合,并用嵌套的For-Each遍历它们。“酷蓝”你真的很酷。我忽略了这一点:“为了在第二级使用getElementsByTagName,需要将DomNode声明为IXMLDOMElement,而不是IXMLDOMNode。”。感谢|感谢|感谢show如果我使用“ActiveSheet.Cells(Init,1)=DomNode.SelectNodes(“string”)(1).Text”我就能够阅读第二个节点@user2381536感谢你指出这一点,为了完整性,我在我的答案中添加了替代解决方案。我不知道你为什么觉得有必要给它编索引。For-Each循环可以更好地处理它。
<?xml version="1.0" encoding="utf-8"?>
<view>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>8888</string>
<string>99999</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>22222222</string>
<string>2323232323</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>36363636</string>
<string>3737373737</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>50505050</string>
<string>5151515151</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>64646464</string>
<string>6565656565</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
<fieldlist>
<viewField>
<formatterParameterMap>
<entry>
<string>78787878</string>
<string>7979797979</string>
</entry>
</formatterParameterMap>
</viewField>
</fieldlist>
</view>