【问题标题】:How to access XML response using Excel VBA如何使用 Excel VBA 访问 XML 响应
【发布时间】:2020-05-14 01:26:07
【问题描述】:

我有一个 excel 电子表格,其中有 25,000 多条带有纬度/经度坐标和其他数据的记录。我正在尝试使用 Excel VBA 脚本,使用以下美国人口普查 Web 服务链接(包括示例坐标),根据纬度/经度查找关联的县名称。

https://geo.fcc.gov/api/census/block/find?latitude=40.000&longitude=-90.000&format=xml

这将返回以下响应 xml。

<Response status="OK" executionTime="0">
    <Block FIPS="170179601002012" bbox="-90.013605,39.996144,-89.994837,40.010663"/>
    <County FIPS="17017" name="Cass"/>
    <State FIPS="17" code="IL" name="Illinois"/>
</Response>

我遇到的问题是我需要访问 County 节点中包含的“名称”值(即本例中的“Cass”),并且该值将被复制到 County 列下的 Excel 电子表格中。有没有办法访问这个值? XML 响应不是我期望的标准格式(我是 XML 新手)&lt;County&gt;Cass&lt;/County&gt;,所以我不确定如何从这个返回的响应中访问我需要的值。

脚本的整个 XML 连接和响应部分似乎工作正常,我只需要知道如何从相关节点的响应中获取值。

这是我目前所拥有的。任何帮助将不胜感激。如果您需要完整的代码,请告诉我。

standard XML connection stuff here...

XmlResponse = oXMLHTTP.responseText

'Process the XML to get County name

strXML = XmlResponse
Set XDoc = New MSXML2.DOMDocument60

If Not XDoc.LoadXML(XmlResponse) Then
    Err.Raise XDoc.parseError.ErrorCode, , XDoc.parseError.reason
End If

Set xNode = XDoc.SelectSingleNode("/Response/County")
MsgBox xNode.Text

'Insert County name into Excel
Cells(i + 2, 14).Value = xNode.Text

我假设 xNode.Text 部分是我在从响应中选择正确部分时需要帮助的地方 (?)。

非常感谢!

【问题讨论】:

    标签: excel xml vba


    【解决方案1】:

    今天在搜索更多内容时,我找到了原始问题的解决方案。

    对于那些感兴趣的人,您可以访问返回的 xml 响应中的 County 属性“名称”,并通过将上述代码部分替换为以下内容来写出:

    Original:
    Set xNode = XDoc.SelectSingleNode("/Response/County")
    MsgBox xNode.Text
    
    Updated:
    Set xNode = XDoc.SelectSingleNode("//Response/County/@name")
    MsgBox xNode.Text
    

    【讨论】:

    • 发布了一个使用FilterXML() 函数的替代方法,并进一步解释了 XPath 以及可以缩短为“//County/@name”的前导双斜杠。 - 进一步提示:尝试使用完全限定的范围引用,例如通过工作表的代码(名称)Sheet1.Cells(i + 2, 14).Value = xNode.Text,否则 VBA 会采用当前活动的 any 工作表的值。
    【解决方案2】:

    通过 WorksheetFunction `FilterXML() 替代

    如果您处理 Excel 版本。 2013+ 你可以执行以下操作:

    Sub ExampleCall()
    Dim myXML As String, myXPath As String
    myXML = WorksheetFunction.WebService("https://geo.fcc.gov/api/census/block/find?latitude=40.000&longitude=-90.000&format=xml")
    
    myXPath = "//County/@name"               
    
    Debug.Print WorksheetFunction.FilterXML(myXML, myXPath)   ' ~> Cass
    End Sub
    

    FilterXML() 及其 XPath 参数的进一步提示

    以双斜杠// 开头的XPath 字符串"//County/@name" 搜索

    1. &lt;County&gt; 节点任何层次结构级别返回
    2. 必须由前导@ 标识的从属@name 属性FilterXML() 函数返回其文本内容。

    参见FilterXML() functionWebService() function

    当然可以在工作表公式中直接使用这两个函数。

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多