如何从SOAP XML响应中校验ResponseCode并提取SessionToken?
SOAP响应处理问题:无法通过XPath获取ResponseCode值
从第三方供应商获取到SOAP XML响应后,需要校验ResponseCode的值是Success还是Failure:若为Success,则提取a:SessionToken的值并赋值给session_token属性。但当前使用的switch语句中,所有尝试的XPath表达式均无法获取ResponseCode的值。
第三方SOAP XML响应
<?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <LoginResponse xmlns="www.mylocation.com/Order/v1"> <LoginResult xmlns:a="http://schemas.datacontract.org/2010/01/MyStuff.Responses" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <Messages xmlns="http://schemas.datacontract.org/2010/01/MyStuff.Responses.Base" xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> <b:string>Login Successful</b:string> </Messages> <ResponseCode xmlns="http://schemas.datacontract.org/2010/01/MyStuff.Responses.Base">Success</ResponseCode> <a:SessionToken>a4478-555d5-12rd-8989-jd776smjk</a:SessionToken> </LoginResult> </LoginResponse> </s:Body> </s:Envelope> </soapenv:Body> </soapenv:Envelope>
当前使用的Switch代码
<switch source="//ResponseCode/text()" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <case regex="Success"> <property expression="//a:SessionToken" name="session_token" scope="default" type="STRING" xmlns:a="http://schemas.datacontract.org/2010/01/MyStuff.Responses" xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.datacontract.org/2010/01/MyStuff.Responses.Base" xmlns:v1="www.mylocation.com/Order/v1"/> </case> <case regex="Failure"> <property expression="body" name="_payload" scope="default" type="OM" xmlns:a="http://schemas.datacontract.org/2010/01/MyStuff.Responses" xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.datacontract.org/2010/01/MyStuff.Responses.Base" xmlns:v1="www.mylocation.com/Order/v1"/> </case> <default> <log> <property name="session_token" value="No valid response found"/> </log> </default> </switch>
问题原因及修正方案
核心问题
XPath无法定位元素的原因是未在switch根标签上绑定ResponseCode所属的命名空间,且XPath未使用命名空间前缀。ResponseCode属于http://schemas.datacontract.org/2010/01/MyStuff.Responses.Base命名空间,直接用//ResponseCode会忽略命名空间,导致无法匹配到对应元素。
修正后的Switch代码
<switch source="//m:ResponseCode/text()" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:m="http://schemas.datacontract.org/2010/01/MyStuff.Responses.Base" xmlns:a="http://schemas.datacontract.org/2010/01/MyStuff.Responses"> <case regex="Success"> <property expression="//a:SessionToken/text()" name="session_token" scope="default" type="STRING"/> </case> <case regex="Failure"> <property expression="body" name="_payload" scope="default" type="OM"/> </case> <default> <log> <property name="session_token" value="No valid response found"/> </log> </default> </switch>
关键调整说明
- 在switch根标签上声明命名空间:绑定
m前缀到ResponseCode的命名空间,a前缀到SessionToken的命名空间,避免在每个case标签重复声明。 - 修正XPath表达式:
- 用
//m:ResponseCode/text()定位ResponseCode的文本值,确保匹配到正确的命名空间元素 - 提取
SessionToken时用//a:SessionToken/text()获取文本内容,而非直接取元素节点,保证session_token属性存储的是纯字符串值
- 用
- 简化命名空间声明:将重复的命名空间声明移到switch根标签,减少冗余代码。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

