【发布时间】:2021-03-02 05:05:07
【问题描述】:
我可能在这里犯了一些愚蠢的错误,但我被困住了,所以希望你们中的一些人能帮助我。
我已经使用 DOMDocument 和 XMLHTTP 通过 post 将 XML 加载到 xmlDoc
Set xmlhtp = CreateObject("MSXML2.XMLHTTP.6.0")
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
当我收到来自 API 的响应时,我将其写入一个单元格以检查响应,并在那里加载。我找到了我的节点和我的信息。我把它写到一个单元格中
With xmlhtp
.Open "post", sURL, False
.setRequestHeader "Host", "Host-name"
.setRequestHeader "Content-Type", "text/xml;charset=UTF-8"
.setRequestHeader "soapAction", "action-ID"
.send sEnv
xmlDoc.LoadXML .responseText
Worksheets("Ark1").Range("A11").Value = .responseText
MsgBox (xmlDoc.SelectSingleNode("//ExternalReference"))
在我到 A11 的转储中,我找到了节点 ExternalReference,其中包含信息,请参见屏幕截图
但即使一切看起来都很好,MsgBox 也找不到节点。我收到“对象变量或未设置块变量”-错误消息。
我试图从我在 SoapUI 中得到的响应中添加所有 xmlns-URL,但这没有任何帮助。
我还尝试使用我知道在我拥有的另一个代码中工作的序列循环通过该节点(案例)的父节点(昨天在这里获得了一些帮助(不过这次不是相同的脚本或 XML):
How to loop through XML-nodes and validate if values exists?)
我尝试运行的循环,它也没有产生任何内容(似乎在 XML 中找不到节点)
Const MAX_AR As Long = 3
Dim Casep, Casec, c As Range, i As Long
Set c = Worksheets("Ark1").Range("J1")
Set Casep = xmlDoc.getElementsByTagName("Case")
For Each Casec In Casep
c.Offset(0, i) = Casec.getElementsByTagName("AccountName")(0).Text
c.Offset(1, i) = Casec.getElementsByTagName("ContractName")(0).Text
c.Offset(2, i) = Casec.getElementsByTagName("ExternalReference")(0).Text
i = i + 1
If i >= MAX_AR Then Exit For 'Hopp ut ved oppnådd Max År
Next Casec
它有帮助,这里是 XML 的清理部分:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ResponseHeader xmlns:h="URL to schema" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<QueueId i:nil="true" xmlns="URL to schema"/>
<SessionId xmlns="URL to schema">123456789</SessionId>
</h:ResponseHeader>
</s:Header>
<s:Body>
<CaseGetResponse xmlns="URL to schema">
<Case xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<AccountName>123456</AccountName>
<ContractName>123456</ContractName>
<ExternalReference>extref</ExternalReference>
<ExternalReference2 i:nil="true"/>
<ExternalReferences/>
<ExternalSystemReference i:nil="true"/>
<Sequence>654321</Sequence>
【问题讨论】:
-
body 标签有一个命名空间
s,您可能需要先添加它才能解析内容。您能否显示声明的位置(请将 XML 发布为文本;否则我们必须将其全部输入以进行我们自己的任何测试) -
嗨@TimWilliams!我没有在我的代码中声明它,但它在响应中声明(请参阅上面以文本格式更新的 XML)。它也应该在我的代码中声明吗?
标签: excel xml vba api domdocument