从URL下载输出(XML),然后解析XML以获取数据?

时间:2016-02-20 05:00:09

标签: vba excel-vba excel

我试图下载Google Map API输出的XML数据。在将数据下载并存储到变量中之后,我想解析该数据以获取特定信息。以下是示例输出的链接:http://maps.googleapis.com/maps/api/geocode/xml?latlng=34.6465583799,-101.57620022

Dim oXMLHTTP As Object
Dim sPageHTML  As String
Dim sURL As String
Dim XmlMapResponse As String


sURL = "http://maps.googleapis.com/maps/api/geocode/xml?latlng=" + Selection.Value

Set oXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
oXMLHTTP.Open "GET", sURL, False
oXMLHTTP.send
XmlMapResponse = oXMLHTTP.responseText

下载XML数据后,我尝试解析" 79088 "这是邮政编码:

Dim strXML As String
Dim xNode As IXMLDOMNode
Dim XDoc As MSXML2.DOMDocument

strXML = XmlMapResponse

Set XDoc = New MSXML2.DOMDocument

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

Set xNode = XDoc.SelectNodes("/GeocodeResponse/result/address_component/long_name")

MsgBox xNode.InnerText(6)

我不知道为什么xNode.InnerText(6)对我不起作用。在VB.NET中它工作正常。

任何帮助?

2 个答案:

答案 0 :(得分:0)

SelectNodes返回节点列表,而不是单个节点。

也许你打算使用:

Set xNode = XDoc.SelectNodes( _
             "/GeocodeResponse/result/address_component/long_name")(6)

答案 1 :(得分:0)

如前所述,SelectNodes返回一个节点列表,当我尝试运行此代码时会导致错误。您应该:

  • 将xNode更改为IXMLDOMNodeList
  • 从列表中仅选择一个节点(由Tim建议)
  • 将功能更改为XDoc.selectSingleNode(" / XPATH")

除此之外,IXMLDOMNode对象似乎不支持InnerText函数。改为使用xNode.Text。

以下代码运行且没有错误,并返回第一个结果(8379)

Sub test()
Dim oXMLHTTP As Object
Dim sPageHTML  As String
Dim sURL As String
Dim XmlMapResponse As String

sURL = "http://maps.googleapis.com/maps/api/geocode/xml?latlng=" + "34.6465583799,-101.57620022"

Set oXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
oXMLHTTP.Open "GET", sURL, False
oXMLHTTP.send
XmlMapResponse = oXMLHTTP.responseText

Dim strXML As String
Dim xNode As MSXML2.IXMLDOMNode
Dim XDoc As MSXML2.DOMDocument60

strXML = XmlMapResponse

Set XDoc = New MSXML2.DOMDocument60

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

Set xNode = XDoc.SelectSingleNode("/GeocodeResponse/result/address_component/long_name")

MsgBox xNode.Text
End Sub