2009-07-29 44 views
4

鑑於以下XML:VBScript中,MSXML和命名空間

<?xml version="1.0"?> 
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <GetMsisdnResponse xmlns="http://my.domain.com/"> 
      <GetMsisdnResult> 
       <RedirectUrl>http://my.domain.com/cw/DoIdentification.do2?sessionid=71de6551fc13e6625194</RedirectUrl> 
      </GetMsisdnResult> 
     </GetMsisdnResponse> 
    </soap:Body> 
</soap:Envelope> 

我試圖訪問使用XPath的的redirectUrl元素在VBScript:

set xml = CreateObject("MSXML2.DOMDocument") 
xml.async = false 
xml.validateOnParse = false 
xml.resolveExternals = false 
xml.setProperty "SelectionLanguage", "XPath" 
xml.setProperty "SelectionNamespaces", "xmlns:s='http://my.domain.com/' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'" 

err.clear 
on error resume next 
xml.loadXML (xmlhttp.responseText) 
if (err.number = 0) then 

    redirectUrl = xml.selectSingleNode("/soap:Envelope/soap:Body/s:GetMsisdnResponse/s:GetMsisdnResult/s:RedirectUrl").text 
end if 

但未能找到的redirectUrl節點,因此當我嘗試獲取.text屬性時什麼也不是。我在做什麼錯誤

+0

@Xetius,因爲您使用xmlhttp爲什麼不檢索返回DOMDocument的xmlhttp ReceivedXML屬性? (服務器需要在Content-Type頭中指定一個xml mime類型,如text/xml)。 – AnthonyWJones 2009-07-30 08:27:12

回答

9

您正在使用錯誤的名稱空間聲明。

在你的XML你有

http://www.w3.org/2003/05/soap-envelope

,但在你的腳本,你使用

http://schemas.xmlsoap.org/soap/envelope/

這個工作對我來說:

xml.setProperty "SelectionNamespaces", "xmlns:s='http://my.domain.com/' xmlns:soap='http://www.w3.org/2003/05/soap-envelope'" 

' ... 

Set redirectUrl = xml.selectSingleNode("/soap:Envelope/soap:Body/s:GetMsisdnResponse/s:GetMsisdnResult/s:RedirectUrl") 

在一個不同的說明 - 我會盡量保留受0123影響的行聲明絕對最低。理想情況下,它僅適用於單個關鍵線(或者您將關鍵部分包裝在Sub中)。這使得調試很方便

例如,您在Set redirectUrl = ...中缺少Set語句。當On Error Resume Next打開時,這將無聲無息地失敗。

嘗試

' this is better than loadXML(xmlHttp.responseText) 
xmlDocument.load(xmlHttp.responseStream) 

If (xmlDocument.parseError.errorCode <> 0) Then 
    ' react to the parsing error 
End If 

Xpath = "/soap:Envelope/soap:Body/s:GetMsisdnResponse/s:GetMsisdnResult/s:RedirectUrl" 
Set redirectUrl = xml.selectSingleNode(Xpath) 

If redirectUrl Is Nothing Then 
    ' nothing found 
Else 
    ' do something 
End If 

看到的 - 沒有必要On Error Resume Next

+1

只是工作 - 謝謝。已經整理了其他代碼。 – Xetius 2009-07-29 14:49:05

3

另請注意,命名空間區分大小寫,但至少有一些MSXML強制它爲小寫。

所以,如果你聲明xml.setProperty "SelectionNamespaces", "xmlns:SSS='http://my.domain.com/'"

,並嘗試xml.selectSingleNode("/SSS:Envelope")它可能會失敗。您需要使用xml.selectSingleNode("/sss:Envelope")

或者更好地使您的命名空間小寫。