Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VBA解析XML文档(MSXMLV6.0)_Xml_Vba_Web Scraping_Xml Parsing_Finance - Fatal编程技术网

使用VBA解析XML文档(MSXMLV6.0)

使用VBA解析XML文档(MSXMLV6.0),xml,vba,web-scraping,xml-parsing,finance,Xml,Vba,Web Scraping,Xml Parsing,Finance,我试图直接解析来自SEC的财务信息,但对在excel中使用VBA解析XML文档有疑问。我知道可以通过引用子节点和项目编号的文档进行操作,但是文档非常庞大,需要花费很长时间才能通读并识别我需要的每个项目 我在网上看到,使用XPATH来更高效地查询XML文档是很常见的。我尝试过很多方法,但到目前为止都没有成功。我认为我的问题是理解元素所在的名称空间以及如何正确引用指定名称空间下的元素 下面是我试图引用任意元素的部分代码 Sub SecData() Dim xml_obj As MSXML2.XML

我试图直接解析来自SEC的财务信息,但对在excel中使用VBA解析XML文档有疑问。我知道可以通过引用子节点和项目编号的文档进行操作,但是文档非常庞大,需要花费很长时间才能通读并识别我需要的每个项目

我在网上看到,使用XPATH来更高效地查询XML文档是很常见的。我尝试过很多方法,但到目前为止都没有成功。我认为我的问题是理解元素所在的名称空间以及如何正确引用指定名称空间下的元素

下面是我试图引用任意元素的部分代码

Sub SecData()

Dim xml_obj As MSXML2.XMLHTTP60
Dim xDoc As New MSXML2.DOMDocument60
Dim xml_url As String
Dim nodes As Variant

Set xml_obj = New MSXML2.XMLHTTP60

xml_url = "https://www.sec.gov/Archives/edgar/data/320193/000032019321000010/aapl-20201226_htm.xml"
xml_obj.Open bstrMethod:="GET", bstrURL:=xml_url
xml_obj.send

xDoc.LoadXML (xml_obj.responseText)

xDoc.SetProperty "SelectionLanguage", "XPath"
xDoc.SetProperty "SelectionNamespaces", "xmlns:link='http://www.xbrl.org/2003/linkbase'"

nodes = xDoc.SelectNodes("//RevenueFromContractWithCustomerExcludingAssessedTax")
XML文档太大,无法包含在问题中,因此我将在下面留下一个链接

任何帮助都将不胜感激

谢谢

介绍了名称空间继承

如果命名空间没有前缀(如此前缀):

 xmlns="http://www.xbrl.org/2003/instance"
然后它被它下面的任何东西继承

如果有前缀(这里是“xbrldi”)

然后,只有在元素中显式使用时,才会继承它,例如:

<xbrldi:explicitMember dimension="us-gaap:StatementClassOfStockAxis">
例如:

Dim xDoc作为新的MSXML2.DOMDocument60
变暗节点作为变量
xDoc.resolveExternals=False“不要尝试解析外部资源
xDoc.validateOnParse=True
使用本地副本加载“C:\Temp\aapl-20201226_htm.xml”进行测试。。。
调试。出现问题时打印xDoc.parseError.reason
xDoc.SetProperty“SelectionLanguage”、“XPath”
'添加名称空间:第一个是默认名称空间,前缀为“xxx”
xDoc.SetProperty“SelectionNamespaces”_
“xmlns:xxx=”http://www.xbrl.org/2003/instance' " & _
“xmlns:link=”http://www.xbrl.org/2003/linkbase' " & _
“xmlns:美国公认会计准则”http://fasb.org/us-gaap/2020-01-31'"
“+需要的其他名称空间。。。
'不带前缀的元素:使用我们为默认命名空间添加的“dummy”`xxx`前缀
Set nodes=xDoc.SelectNodes(//xxx:context)
调试.打印节点.长度'207
'这些元素属于特定的命名空间,因此请使用该前缀。。。
Set nodes=xDoc.SelectNodes(//us gaap:RevenueFromContractwithCustomerExcludingAssedTax)
调试.打印节点.长度'28
介绍了命名空间继承

如果命名空间没有前缀(如此前缀):

 xmlns="http://www.xbrl.org/2003/instance"
然后它被它下面的任何东西继承

如果有前缀(这里是“xbrldi”)

然后,只有在元素中显式使用时,才会继承它,例如:

<xbrldi:explicitMember dimension="us-gaap:StatementClassOfStockAxis">
例如:

Dim xDoc作为新的MSXML2.DOMDocument60
变暗节点作为变量
xDoc.resolveExternals=False“不要尝试解析外部资源
xDoc.validateOnParse=True
使用本地副本加载“C:\Temp\aapl-20201226_htm.xml”进行测试。。。
调试。出现问题时打印xDoc.parseError.reason
xDoc.SetProperty“SelectionLanguage”、“XPath”
'添加名称空间:第一个是默认名称空间,前缀为“xxx”
xDoc.SetProperty“SelectionNamespaces”_
“xmlns:xxx=”http://www.xbrl.org/2003/instance' " & _
“xmlns:link=”http://www.xbrl.org/2003/linkbase' " & _
“xmlns:美国公认会计准则”http://fasb.org/us-gaap/2020-01-31'"
“+需要的其他名称空间。。。
'不带前缀的元素:使用我们为默认命名空间添加的“dummy”`xxx`前缀
Set nodes=xDoc.SelectNodes(//xxx:context)
调试.打印节点.长度'207
'这些元素属于特定的命名空间,因此请使用该前缀。。。
Set nodes=xDoc.SelectNodes(//us gaap:RevenueFromContractwithCustomerExcludingAssedTax)
调试.打印节点.长度'28

感谢您快速而全面的回答。这个链接也很有帮助。可以看出,XML不是我的强项。我不喜欢要求别人给出答案,但我如何将“us gaap”名称空间别名添加到集合中?这里的示例:太好了,谢谢!谢谢你快速而彻底的回答。这个链接也很有帮助。可以看出,XML不是我的强项。我不喜欢要求别人给出答案,但我如何将“us gaap”名称空间别名添加到集合中?这里的示例:太好了,谢谢!如果我搜索它
RevenueFromContractwithCustomerExcludingAssedTax
,我会在该页面中得到28个结果。你想要28个结果吗?老实说,我还没有确切地验证我要寻找的值。我希望找出引用任何特定元素的流程,然后在我找到需要的内容后应用该流程。因此,为了可怕地回答你的问题,我可能需要28个结果……这是有效的
xDoc.getElementsByTagName(“us gaap:RevenueFromContractwithCustomerExcludingAssedTax”)
。如果我搜索它
RevenueFromContractwithCustomerExcludingAssedTax
,我会在该页面中得到28个结果。你想要28个结果吗?老实说,我还没有确切地验证我要寻找的值。我希望找出引用任何特定元素的流程,然后在我找到需要的内容后应用该流程。因此,为了可怕地回答你的问题,我可能需要28个结果……这是有效的
xDoc.getElementsByTagName(“美国公认会计准则:收入与客户签订的合同,不包括资产税”)