从VBA中的节点提取XML数据

时间:2017-12-27 12:46:00

标签: vba excel-vba xml-parsing excel

嘿,我正试图看看我做错了什么,希望你能帮助我 我得到 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:idsf:name,你能帮我修改我的代码吗?

度过美好的一天

1 个答案:

答案 0 :(得分:0)

评论说你的原始Xml没有&#34;编译&#34; (格式良好)所以我编辑了那个资源,我希望这是一个很好的编辑,因为我已经编写了反对它的代码。

我有Xml命名空间的问题,因为我不知道如何获取默认命名空间,我可以跳过前缀。所以我被迫在我的解决方案中总是使用前缀,即使我必须伪造一个。伪命名空间dom.setProperty "SelectionNamespaces", "xmlns:sf='urn:sobject.enterprise.soap.sforce.com' xmlns:sf2='urn:enterprise.soap.sforce.com'在我的行开头添加

<records/>

我希望真正的Xml命名空间专家可以更好地重写这个答案。在此期间,此代码有效。所以我将文件保存到本地驱动器。此外,可以直接钻取并直接抓取两个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

players = {'player-{}'.format(num): 0 for num in range(1, num_players + 1)}