使用Excel VBA解析在线Web服务XML时无法读取内部节点
问题原因
- 返回的XML携带了默认命名空间
http://xmldata.qrz.com,MSXML2.DOMDocument60执行XPath查询时,必须先显式注册命名空间前缀,否则无法匹配到对应节点,所以你调用SelectNodes("QRZDatabase/Session")返回的是空节点集合,后续循环不会执行。
修复方案
你只需要在XML文档加载完成后,新增命名空间注册逻辑,同时修改XPath查询语句添加对应前缀即可,修改后的完整代码如下:
Sub test() '创建请求对象 Dim xml_Obj As MSXML2.XMLHTTP60 Set xml_Obj = New MSXML2.XMLHTTP60 Dim baseURL As String Dim uName As String Dim pWord As String Dim sURL As String '拼接请求地址 baseURL = "http://xmldata.qrz.com/xml/current/?" uName = "username=w4gfq;" pWord = "password=********" sURL = baseURL + uName + pWord xml_Obj.Open "GET", sURL, False xml_Obj.send Debug.Print "The request was " + xml_Obj.StatusText '创建XML文档对象 Dim XDoc As MSXML2.DOMDocument60 Dim xNodes As IXMLDOMNodeList Dim xNode As MSXML2.IXMLDOMNode Set XDoc = New MSXML2.DOMDocument60 '关闭异步加载,确保XML完全加载后再执行后续逻辑 XDoc.async = False XDoc.LoadXML xml_Obj.ResponseText '新增:检查XML加载是否出错 If XDoc.parseError.errorCode <> 0 Then Debug.Print "XML加载错误:" & XDoc.parseError.reason Exit Sub End If Debug.Print XDoc.ChildNodes.Item(1).BaseName '新增:注册命名空间,自定义前缀qrz对应返回值的默认命名空间地址 XDoc.SetProperty "SelectionNamespaces", "xmlns:qrz='http://xmldata.qrz.com'" '修改:XPath查询添加qrz前缀 Set xNodes = XDoc.SelectNodes("qrz:QRZDatabase/qrz:Session") For Each xNode In xNodes Debug.Print "----------------" '修改:子节点查询也需要添加qrz前缀 Debug.Print xNode.SelectSingleNode("qrz:Key").Text Next End Sub
补充注意
如果运行时报错找不到MSXML2相关类型,请确认VBA编辑器的「工具-引用」中已经勾选了「Microsoft XML, v6.0」选项。
内容的提问来源于stack exchange,提问作者Casper32043
相关产品推荐
相关产品推荐

