[英]VBA Excel Macro SelectSingleNode returns nothing
我第一次使用excel宏,我編寫了解析Web服務響應的代碼,我想更新excel中單個單元格中的標記值。
以下是我的XML摘錄(一個巨大的Web服務響應)
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
<soap:Body>
<bm:getTransactionResponse xmlns:bm="http://xmlns.oracle.com/XXXCLD/commerce/ZZZYYY_PPP_1">
<bm:status>
<bm:success>true</bm:success>
<bm:message>Wed Apr 06 09:04:32 UTC 2016 - Successfully processed API for test1</bm:message>
</bm:status>
<bm:transaction>
<bm:category>data</bm:category>
<bm:action>add</bm:action>
<bm:id>1111</bm:id>
<bm:process_var_name>xvgfdr</bm:process_var_name>
<bm:buyer_company_name>test1</bm:buyer_company_name>
<bm:supplier_company_name>test1</bm:supplier_company_name>
<bm:step_var_name>waitingForInternalApproval</bm:step_var_name>
<bm:last_document_number>2</bm:last_document_number>
<bm:date_added>2016-04-04 12:14:57</bm:date_added>
<bm:date_modified>2016-04-06 09:04:18</bm:date_modified>
<bm:data_xml>
<bm:transaction bm:bs_id="11111" bm:buyer_company_name="test1" bm:buyer_user_name="someone" bm:currency_pref="GBP" bm:data_type="0" bm:document_name="Transaction" bm:document_number="1" bm:document_var_name="transaction" bm:process_var_name="XXX_1" bm:supplier_company_name="test1">
<bm:_document_number>1</bm:_document_number>
<bm:createdBy_t>SomeOne</bm:createdBy_t>
<bm:_price_book_var_name>_default</bm:_price_book_var_name>
<bm:createdDate_t>2016-04-04 00:00:00</bm:createdDate_t>
<bm:currency_t>INR</bm:currency_t>
<bm:_customer_t_first_name/>
<bm:_customer_t_last_name/>
<bm:_customer_t_company_name>Test Account</bm:_customer_t_company_name>
我正在嘗試獲取Tag <bm:_customer_t_company_name>
下面是代碼,我一直在使用。
Sub Button1_Click()
'Set and instantiate our working objects
Dim Req As Object
Dim sEnv As String
Dim Resp As New MSXML2.DOMDocument60
Set Req = CreateObject("MSXML2.XMLHTTP")
Set Resp = CreateObject("MSXML2.DOMDocument.6.0")
With Req
.Open "Post", "https://XXXX.com/", False
Dim Pwd As String
Pwd = Range("D8").Value
Dim QuoteId As String
QuoteId = Range("D9").Value
' SOAP envelope for submission to the Web Service
sEnv = sEnv & "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"">"
sEnv = sEnv & " <soapenv:Header>"
sEnv = sEnv & " <wsse:Security xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"" xmlns:wsu=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"">"
sEnv = sEnv & " <wsse:UsernameToken wsu:Id=""UsernameToken-2"">"
sEnv = sEnv & " <wsse:Username>" & Range("D7").Value & "</wsse:Username>"
sEnv = sEnv & " <wsse:Password Type=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"">" & Pwd & "</wsse:Password>"
sEnv = sEnv & " </wsse:UsernameToken>"
sEnv = sEnv & " </wsse:Security>"
sEnv = sEnv & " </soapenv:Header>"
sEnv = sEnv & " <soapenv:Body>"
sEnv = sEnv & " <bm:getTransaction>"
sEnv = sEnv & " <bm:transaction>"
sEnv = sEnv & " <bm:id>" & Range("D9").Value & "</bm:id>"
sEnv = sEnv & " </bm:transaction>"
sEnv = sEnv & " </bm:getTransaction>"
sEnv = sEnv & " </soapenv:Body>"
sEnv = sEnv & "</soapenv:Envelope>"
' Send SOAP Request
.send (sEnv)
Resp.LoadXML Req.responseText
End With
If Resp Is Nothing Then
MsgBox "No XML"
End If
With Resp
.setProperty "SelectionNamespaces", "xmlns:bm=""http://xmlns.oracle.com/XXXCLD/commerce/ZZZYYY_PPP_1"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"""
Dim strName As String
If .SelectSingleNode("//bm:_customer_t_company_name") Is Nothing Then
MsgBox "No Node"
End If
strName = .SelectSingleNode("//bm:_customer_t_company_name").Text
MsgBox strName
End With
'clean up code
Set Req = Nothing
Set Resp = Nothing
Range("A1").Value = "DONE"
End Sub
.SelectSingleNode(“// soap:Body”)工作正常。 當我測試代碼時,.SelectSingleNode(“// bm:_customer_t_company_name”)總是返回Nothing。 那就是
.SelectSingleNode(“// bm:getTransactionResponse”),什么都不返回。
你能告訴我我做錯了什么嗎?
這是完整XML結構的屏幕截圖, 在此處輸入圖像描述
你提出的代碼沒有任何問題。 您應該檢查Web服務實際返回的XML,以確保它具有您正在查找的標記。
我將您的示例縮減為以下VBA Sub,運行時沒有錯誤。
Sub Test()
Dim xml
Set xml = CreateObject("MSXML2.DOMDocument.6.0")
xml.LoadXML "<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <SOAP-ENV:Header xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/""/> <soap:Body> <bm:getTransactionResponse xmlns:bm=""http://xmlns.oracle.com/XXXCLD/commerce/ZZZYYY_PPP_1""> <bm:status> <bm:success>true</bm:success> <bm:message>Wed Apr 06 09:04:32 UTC 2016 - Successfully processed API for test1</bm:message> </bm:status> <bm:transaction> <bm:category>data</bm:category> <bm:action>add</bm:action> <bm:id>1111</bm:id> <bm:process_var_name>xvgfdr</bm:process_var_name> <bm:buyer_company_name>test1</bm:buyer_company_name> <bm:supplier_company_name>test1</bm:supplier_company_name> <bm:step_var_name>waitingForInternalApproval</bm:step_var_name> <bm:last_document_number>2</bm:last_document_number> <bm:date_added>2016-04-04 12:14:57</bm:date_added> <bm:date_modified>2016-04-06 09:04:18</bm:date_modified> <bm:data_xml> <bm:transaction bm:bs_id=""11111"" bm:buyer_company_name=""test1"" bm:buyer_user_name=""someone"" bm:currency_pref=""GBP"" bm:data_type=""0"" bm:document_name=""Transaction"" bm:document_number=""1"" bm:document_var_name=""transaction"" bm:process_var_name=""XXX_1"" bm:supplier_company_name=""test1""> <bm:_document_number>1</bm:_document_number> <bm:createdBy_t>SomeOne</bm:createdBy_t> <bm:_price_book_var_name>_default</bm:_price_book_var_name> <bm:createdDate_t>2016-04-04 00:00:00</bm:createdDate_t> <bm:currency_t>INR</bm:currency_t> <bm:_customer_t_first_name/> <bm:_customer_t_last_name/> <bm:_customer_t_company_name>Test Account</bm:_customer_t_company_name> </bm:transaction> </bm:data_xml> </bm:transaction> </bm:getTransactionResponse> </soap:Body> </soap:Envelope>"
xml.SetProperty "SelectionNamespaces", "xmlns:bm=""http://xmlns.oracle.com/XXXCLD/commerce/ZZZYYY_PPP_1"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"""
Debug.Print xml.SelectSingleNode("//bm:_customer_t_company_name").Text
End Sub
輸出是Test Account
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.