VBA XML子节点

Exo*_*ant 1 xml excel vba excel-vba

我正在尝试修改从user2140261获得的一段很好的代码,该代码从XML类型(XBRL模板)SEC EDGAR数据库中提取数据。因此,由于我也想从其他Node中提取元素值,因此我的第一个想法是在MsgBox中显示带有XML实例的Node的列表。通过使用childNodes属性。第一个小片段具有我为避免混淆而进行的较小修改,而在第二个中,我们看到了原始代码以及修改的3条语句

Dim Tiger As String  

Tiger = objXMLNodexbrl.ChildNodes(1)

MsgBox Tiger
Run Code Online (Sandbox Code Playgroud)
Sub GetNode()
Dim strXMLSite As String
Dim objXMLHTTP As MSXML2.XMLHTTP
Dim objXMLDoc As MSXML2.DOMDocument
Dim objXMLNodexbrl As MSXML2.IXMLDOMNode
Dim objXMLNodeDIIRSP As MSXML2.IXMLDOMNode
Dim Tiger As String

Set objXMLHTTP = New MSXML2.XMLHTTP
Set objXMLDoc = New MSXML2.DOMDocument

strXMLSite = "http://www.sec.gov/Archives/edgar/data/10795/000119312513456802/bdx-20130930.xml"

objXMLHTTP.Open "POST", strXMLSite, False
objXMLHTTP.send
objXMLDoc.LoadXML (objXMLHTTP.responseText)

Set objXMLNodexbrl = objXMLDoc.SelectSingleNode("xbrl")

Tiger = objXMLNodexbrl.ChildNodes(1)

MsgBox Tiger

Set objXMLNodeDIIRSP = objXMLNodexbrl.SelectSingleNode("us-gaap:DebtInstrumentInterestRateStatedPercentage")

Worksheets("Sheet1").Range("A1").Value = objXMLNodeDIIRSP.Text
End Sub
Run Code Online (Sandbox Code Playgroud)

因此,当我尝试使用F8逐步解析代码时,出现“运行时错误438”,告诉我该对象不支持此属性或方法。

在此处输入图片说明

  • 如果实例文档中的xbrl是根元素并且包含所有子节点,那怎么可能?

@ user2140261哇,您太对了...只是一个问题,我确实使用

Tiger = objXMLNodexbrl.ChildNodes(1).Text
Run Code Online (Sandbox Code Playgroud)

但是我正在获取元素的数值,而不是节点数。那怎么可能?由于ChildNodes属性:“包含包含子节点的节点列表” ...

在此处输入图片说明

use*_*261 5

从以下位置更改代码行:

Tiger = objXMLNodexbrl.ChildNodes(1)
Run Code Online (Sandbox Code Playgroud)

Tiger = objXMLNodexbrl.ChildNodes(1).Text
Run Code Online (Sandbox Code Playgroud)

ALTERNATIVLY你可以

将Tiger从字符串更改为MSXML2.IXMLDOMNode

然后改变

MsgBox Tiger
Run Code Online (Sandbox Code Playgroud)

MsgBox Tiger.Text
Run Code Online (Sandbox Code Playgroud)

objXMLNodexbrl.ChildNodes.Length 将返回其中的节点数 XBRL

如果您试图获取XBRL的所有子节点名称的列表,则请调暗另一个MSXML2.IXMLDOMNode nodeCurrent并使用以下命令:

For Each nodeCurrent In objXMLNodexbrl.ChildNodes
    Tiger = Tiger & ", " & nodeCurrent.nodeName
Next nodeCurrent

MsgBox Tiger
Run Code Online (Sandbox Code Playgroud)