You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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>

关键调整说明

  1. 在switch根标签上声明命名空间:绑定m前缀到ResponseCode的命名空间,a前缀到SessionToken的命名空间,避免在每个case标签重复声明。
  2. 修正XPath表达式:
    • 用//m:ResponseCode/text()定位ResponseCode的文本值,确保匹配到正确的命名空间元素
    • 提取SessionToken时用//a:SessionToken/text()获取文本内容,而非直接取元素节点,保证session_token属性存储的是纯字符串值
  3. 简化命名空间声明:将重复的命名空间声明移到switch根标签,减少冗余代码。

内容的提问来源于stack exchange,提问作者Johan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:48:11