从VBA中的节点提取XML数据

问题描述 投票:0回答:1

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

祝你有美好的一天

vba excel-vba xml-parsing excel
1个回答
0
投票

正如评论你原来的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
© www.soinside.com 2019 - 2024. All rights reserved.