5

次の 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>

VBScript で XPath を使用して RedirectUrl 要素にアクセスしようとしています。

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 プロパティを取得しようとしても何も起こりません。私は何を間違っていますか

4

2 に答える 2

10

間違った名前空間宣言を使用しています。

あなたの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")

別の注意点として、On Error Resume Nextステートメントの影響を受ける行を最小限に抑えるようにします。理想的には、単一のクリティカルラインに対してのみ有効です(またはクリティカルセクションをでラップしますSub)。これにより、デバッグがはるかに簡単になります。

たとえば、にSetステートメントがありませんSet redirectUrl = ...。オンがオンの場合、これはサイレントに失敗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ん。

于 2009-07-29T12:07:30.220 に答える
3

また、名前空間では大文字と小文字が区別されますが、少なくとも一部の MSXML では小文字が強制されることに注意してください。

だから宣言すればxml.setProperty "SelectionNamespaces", "xmlns:SSS='http://my.domain.com/'"

失敗xml.selectSingleNode("/SSS:Envelope")するかもしれません。

を使用する必要がありますxml.selectSingleNode("/sss:Envelope")

または、名前空間を小文字にすることをお勧めします。

于 2014-01-30T09:59:22.370 に答える