如何用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
相关产品推荐
相关产品推荐

