5 Stimmen

VBScript, MSXML und Namespaces

Gegeben sei das folgende XML:

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

Ich versuche, auf das RedirectUrl-Element mit XPath in VBScript zuzugreifen:

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

aber es ist nicht zu finden, die RedirectUrl Knoten, daher ist nichts, wenn ich versuche, die .text-Eigenschaft zu erhalten. Was mache ich falsch

10voto

Tomalak Punkte 320467

Sie verwenden die falsche Namespace-Deklaration.

In Ihrem XML haben Sie

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

aber in Ihrem Skript verwenden Sie

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

Das funktioniert bei mir:

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

Anders ausgedrückt: Ich würde versuchen, die Zeilen, die von einer On Error Resume Next Anweisung an eine absolut Minimum. Im Idealfall gilt sie nur für eine einzige kritische Zeile (oder Sie umhüllen den kritischen Abschnitt mit einem Sub ). Das macht die Fehlersuche eine Menge einfacher.

Sie vermissen zum Beispiel eine Set Anweisung in Set redirectUrl = ... . Dies schlägt fehl, wenn Ein Error Resume Next ist eingeschaltet.

Versuchen Sie

' 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

Siehe - nein On Error Resume Next notwendig.

3voto

David Steele Punkte 31

Beachten Sie auch, dass der Namensraum zwischen Groß- und Kleinschreibung unterscheidet, dass aber zumindest einige MSXML-Dateien die Kleinschreibung erzwingen.

Wenn Sie also erklären, dass xml.setProperty "SelectionNamespaces", "xmlns:SSS='http://my.domain.com/'"

und versuchen xml.selectSingleNode("/SSS:Envelope") kann es scheitern.

Sie müssen Folgendes verwenden xml.selectSingleNode("/sss:Envelope") .

Oder Sie sollten Ihre Namensräume klein schreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X