gpt4 book ai didi

excel - 如何在 VBA 中解析 XML 并检索特定值

转载 作者:行者123 更新时间:2023-12-03 02:16:39 25 4
gpt4 key购买 nike

我已经花了两周时间搜索如何解析一个特定的 XML 并只获取几个值,但没有成功。我已经尝试了互联网上的每一个代码,直到找到一个可以解决我的部分问题的代码。

我尝试获取的 XML 来自美国农业部,并且可以免费访问。

https://apps.fas.usda.gov/psdonline/app/index.html#/app/about

    Dim xmlDoc As MSXML2.DOMDocument60
Dim xmlNode As MSXML2.IXMLDOMNode
Dim xmlNodeList As MSXML2.IXMLDOMNodeList
Dim myNode As MSXML2.IXMLDOMNode

Dim URL As String, APIkey As String

APIkey = "8DB688F8-1E22-4031-B581-59C221ECDDA6"

URL = "https://apps.fas.usda.gov/PSDOnlineDataServices/api/CommodityData/GetCommodityDataByYear?commodityCode=2222000&marketYear=2018"

Set xmlDoc = New MSXML2.DOMDocument60
xmlDoc.async = False

With CreateObject("MSXML2.XMLHTTP")
.Open "GET", URL, False
.SetRequestHeader "Accept", "text/xml"
.SetRequestHeader "API_KEY", APIkey
.Send
xmlDoc.loadXML .ResponseText
End With

Set xmlNodeList = xmlDoc.getElementsByTagName("*")
For Each xmlNode In xmlNodeList
For Each myNode In xmlNode.childNodes
If myNode.nodeType = NODE_TEXT Then
Debug.Print xmlNode.nodeName & "=" & xmlNode.text
End If
Next myNode
Next xmlNode
Set xmlDoc = Nothing
End Sub

这段代码的响应显示了列出的整个 XML,但是当我尝试查找一个特定节点时,代码结果什么也没有。

Set xmlNodeList = xmlDoc.getElementsByTagName("*")

我尝试使用地址“//AttributeDescription”,但显然只能使用“*”。

例如,我需要接收以下响应:

AttributeDescription=生产

CountryName=巴西

值=0.00000

我尽最大努力获得正确的响应,并且我还认为 XML 结构的格式不正确,因为在寻址时缺乏响应...

我可以做些什么来解决这个问题吗?

最佳答案

这里有两个单独的问题。

当 XML 文档具有默认命名空间时,MSXML2 使用 XPath 时会出现问题 - 请参阅 here了解详情。从 USDA 网站下载的文档的开头有一些命名空间声明:

<ArrayOfCommodityData xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/PSDOnline.DataServices.Models">

这里声明了两个命名空间。前缀为 i 的一个以及覆盖任何没有命名空间前缀的元素的默认命名空间。如果您查看 XML 文档中的“CalendarYear”条目 - <CalendarYear i:nil="true" /> - 然后您可以看到“CalendarYear”位于默认命名空间中,而“nil”位于“i”命名空间中。

要使 MSXML2 使用默认命名空间,您必须声明一个与默认命名空间具有相同 URI 的命名空间。这是使用 XML 文档的 SelectionNamespaces 属性完成的,如下所示:

xmlDoc.SetProperty "SelectionNamespaces", "xmlns:r='http://schemas.datacontract.org/2004/07/PSDOnline.DataServices.Models'"

我选择了r作为 namespace ,但您选择的名称无关紧要 - 它只需与文档中的任何其他 namespace 不同即可。

这导致了第二个问题。您正在使用getElementsByTagName它只接受标签名称作为参数,但您传入的是 XPath 字符串。要处理 XPath 字符串,您需要使用 SelectNodes相反,您需要使用我们添加的 namespace ,如下所示:

Set xmlNodeList = xmlDoc.SelectNodes("//r:AttributeDescription")

关于excel - 如何在 VBA 中解析 XML 并检索特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58565060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com