从VBA中的节点提取XML数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从VBA中的节点提取XML数据相关的知识,希望对你有一定的参考价值。
嘿,我正试图看看我做错了什么我希望你能帮助我,我得到如下的xml响应
<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sf="urn:sobject.enterprise.soap.sforce.com">
<soapenv:Header>
<LimitInfoHeader>
<limitInfo>
<current>50</current>
<limit>5000000</limit>
<type>API REQUESTS</type>
</limitInfo>
</LimitInfoHeader>
</soapenv:Header>
<soapenv:Body>
<queryResponse>
<result>
<done>true</done>
<queryLocator xsi:nil="true"/>
<records xsi:type="sf:Nodav">
<sf:Id>a0S0E000000DMUg320</sf:Id>
<sf:Name>Netta test 11</sf:Name>
</records>
<records xsi:type="sf:Nodav">
<sf:Id>a0S0E000000DMUg321</sf:Id>
<sf:Name>Netta test 32</sf:Name>
</records>
<size>2</size>
</result>
</queryResponse>
</soapenv:Body>
</soapenv:Envelope>
我的代码看起来像:
Dim xmlhtp As New MSXML2.XMLHTTP
Dim xmlDoc As New MSXML2.DOMDocument
Set records = xmlDoc.DocumentElement
Set lists = records.SelectNodes("//Envelope/Header/Body/queryResponse/result/records")
For Each listNode In lists.ChildNodes
Debug.Print "---Email---"
For Each fieldNode In listNode.ChildNodes
Debug.Print "[" & fieldNode.BaseName & "] = [" & fieldNode.Text & "]"
Next fieldNode
Next listNode
Set records = Nothing
现在我得到了错误,我想要的是从所有记录中获取sf:id
和sf:name
你能帮我修改我的代码吗?
祝你有美好的一天
答案
正如评论你原来的Xml没有“编译”(格式良好)所以我编辑了那个资源我希望它是一个很好的编辑,因为我已经编写了反对它的代码。
我有Xml命名空间的问题,因为我不知道如何获取默认命名空间,我可以跳过前缀。所以我被迫在我的解决方案中总是使用前缀,即使我必须伪造一个。伪命名空间sf2
在我的行开头添加
dom.setProperty "SelectionNamespaces", "xmlns:sf='urn:sobject.enterprise.soap.sforce.com' xmlns:sf2='urn:enterprise.soap.sforce.com'
我希望真正的Xml命名空间专家可以更好地重写这个答案。在此期间,此代码有效。所以我将文件保存到本地驱动器。此外,有可能完全钻进并直接抓住两个<records/>
元素,但如果你想要一个完整的路径然后看到注释掉的Debug.Assert
线
Option Explicit
Sub TestCoreLogic()
Dim dom As MSXML2.DOMDocument60
Set dom = New MSXML2.DOMDocument60
dom.Load "N:xmlfile1.xml"
Debug.Assert dom.parseError.ErrorCode = 0
dom.setProperty "SelectionLanguage", "XPath"
dom.setProperty "SelectionNamespaces", "xmlns:sf='urn:sobject.enterprise.soap.sforce.com' xmlns:sf2='urn:enterprise.soap.sforce.com' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "
CoreLogic dom
End Sub
'
Function CoreLogic(ByVal xmlDoc As MSXML2.DOMDocument60)
Dim records As MSXML2.IXMLDOMElement
Set records = xmlDoc.DocumentElement
Dim lists As MSXML2.IXMLDOMNodeList
'Debug.Assert records.SelectNodes("//soapenv:Envelope").Length = 1
'Debug.Assert records.SelectNodes("//soapenv:Envelope/soapenv:Body").Length = 1
'Debug.Assert records.SelectNodes("//soapenv:Envelope/soapenv:Body/sf2:queryResponse").Length = 1
'Debug.Assert records.SelectNodes("//soapenv:Envelope/soapenv:Body/sf2:queryResponse/sf2:result").Length = 1
'
'Debug.Assert records.SelectNodes("//soapenv:Envelope/soapenv:Body/sf2:queryResponse/sf2:result/sf2:records").Length = 2
'Set lists = records.SelectNodes("//soapenv:Envelope/soapenv:Body/sf2:queryResponse/sf2:result/sf2:records")
Debug.Assert records.SelectNodes("//sf2:records").Length = 2
Set lists = records.SelectNodes("//sf2:records")
Dim listNode As MSXML2.IXMLDOMNode
For Each listNode In lists
Debug.Print "---Email---"
Dim fieldNode As MSXML2.IXMLDOMNode
For Each fieldNode In listNode.ChildNodes
Debug.Print "[" & fieldNode.BaseName & "] = [" & fieldNode.Text & "]"
Next fieldNode
Next listNode
Set records = Nothing
Set lists = Nothing
Set listNode = Nothing
Set fieldNode = Nothing
End Function
以上是关于从VBA中的节点提取XML数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从同一数据库的 VBA 代码中的 MS ACCESS 中提取字段
使用 VBscript 从节点和子节点的 XML 中提取数据