2009-07-29 10 views
4

Vu le code XML suivant:VBScript, MSXML et espaces de noms

<?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> 

Je suis en train d'accéder à l'élément redirectUrl en utilisant XPath dans 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 

mais il ne parvient pas à trouver le nœud redirectUrl, donc n'est rien quand j'essaye d'obtenir la propriété .text. Qu'est-ce que je fais de mal

+0

@Xetius, puisque vous utilisez xmlhttp, pourquoi ne pas récupérer la propriété xmlhttp ReceivedXML qui retourne un DOMDocument? (Le serveur doit spécifier un type mime xml tel que text/xml dans l'en-tête Content-Type). – AnthonyWJones

Répondre

9

Vous utilisez une déclaration d'espace de nom incorrecte.

Dans votre XML vous avez

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

mais dans votre script, vous utilisez

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

Cela fonctionne pour moi:

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") 

Sur une note différente - Je vais essayer de garder les lignes qui sont affectées par un On Error Resume Next déclaration à un absolu minimum. Idéalement, il est en vigueur pour une ligne critique unique (ou vous enveloppez la section critique dans un Sub). Cela rend plus facile le débogage beaucoup. Par exemple, il manque une instruction Set dans Set redirectUrl = .... Cela échouera silencieusement lorsque le Error Resume Next est activé.

Essayez

' 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 

Voir - pas On Error Resume Next nécessaire.

+1

Juste le travail - Merci. Ont rangé le reste du code aussi. – Xetius

3

Notez également que l'espace de noms est sensible à la casse, mais qu'au moins certains MSXML le forcent à minuscules.

Donc, si vous déclarez xml.setProperty "SelectionNamespaces", "xmlns:SSS='http://my.domain.com/'"

et essayer xml.selectSingleNode("/SSS:Envelope") il peut échouer. Vous devez utiliser xml.selectSingleNode("/sss:Envelope").

Ou mieux de faire votre namespaces minuscule.