VBA读取具有相似名称的XML节点

VBA读取具有相似名称的XML节点,vba,xml-parsing,Vba,Xml Parsing,我有一个XML,它看起来像 <view> <fieldlist> <viewField> <formatterParameterMap> <entry> <string> </string> <string </string> </entry> </formatterParameterMap> </viewField> </fi

我有一个XML,它看起来像

    <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>