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

如何用XQuery提取服务响应Fault中CDATA内的ErrorCode值?

Extract ErrorCode from CDATA in Fault Structure with XQuery

Problem

我需要编写XQuery转换来处理服务返回的Fault结构,目标是捕获嵌套在CDATA标签内的ErrorCode元素的值。目前这个Fault结构存储在变量$Fault中,我想把ErrorCode的值赋值给新变量$FaultCode,但不知道如何提取con1:detail元素内的CDATA内容,只写出了部分路径:

$FaultCode = $Fault/con:details/con1:ErrorResponseDetail/con1:detail/ ********

对应的Fault结构如下:

<con:fault xmlns:con="http://www.bea.com/wli/sb/context"> 
<con:errorCode>382502</con:errorCode> 
<con:reason>Received an error response</con:reason> 
<con:details> 
<con1:ErrorResponseDetail xmlns:con1="http://www.bea.com/wli/sb/stages/transform/config"> 
<con1:detail> 
<![CDATA[<Error xmlns="http://servic.abcd.net/V1"> 
<ErrorCode>DATA_AVAILABILITY</ErrorCode> 
<ErrorDescription>{"description":"No Cdata for )"}</ErrorDescription> 
</Error>]]></con1:detail> 
<con1:http-response-code>404</con1:http-response-code> 
</con1:ErrorResponseDetail> 
</con:details> 
<con:location> 
<con:node>TestPPNode</con:node> 
<con:pipeline>TestPPNode_request</con:pipeline> 
<con:stage>Test Stage</con:stage> 
<con:path>request-pipeline</con:path> 
</con:location> 
</con:fault>

Solution

别担心,这里的核心问题是CDATA包裹的内容会被XQuery视为纯文本节点,而不是XML结构,所以你需要先把这段文本解析成XML,才能查询里面的ErrorCode。以下是完整的XQuery代码:

-- 声明所有需要用到的命名空间
declare namespace con = "http://www.bea.com/wli/sb/context";
declare namespace con1 = "http://www.bea.com/wli/sb/stages/transform/config";
declare namespace err = "http://servic.abcd.net/V1";

-- 第一步:获取con1:detail下的CDATA文本内容
let $detail-cdata-text := $Fault/con:details/con1:ErrorResponseDetail/con1:detail/text()
-- 第二步:将纯文本解析为XML节点
let $parsed-error-xml := fn:parse-xml($detail-cdata-text)
-- 第三步:通过命名空间定位到ErrorCode并提取其值
let $FaultCode := $parsed-error-xml/err:Error/err:ErrorCode/text()
-- 返回最终的错误码
return $FaultCode

Explanation

  • 命名空间声明:必须包含CDATA内Error元素的命名空间(这里用err作为前缀),否则XQuery无法正确定位到对应的元素。
  • 提取CDATA文本:text()函数会获取con1:detail元素内的所有文本内容,也就是CDATA包裹的XML字符串。
  • 解析XML:fn:parse-xml()函数将字符串转换为可查询的XML节点集,这样你就能像操作普通XML一样查询里面的元素了。
  • 获取ErrorCode:通过命名空间前缀err定位到Error下的ErrorCode元素,提取它的文本值就是你需要的$FaultCode。

如果CDATA内的XML格式可能存在不规范的情况,你可以考虑添加错误处理逻辑(比如用try/catch包裹parse-xml),但假设你的返回结构是稳定的,上面的代码就能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:21:58