如何用XQuery检测XML中是否存在OperationResponse标签并执行操作
解决XQuery检测XML中OperationResponse标签存在性的问题
原代码的问题
- 未处理XML命名空间:
OperationResponse属于urn:abcd:efgh:bc:1命名空间,原代码未声明和引用该命名空间 - 逻辑判断错误:原代码的条件写法不符合XQuery语法,判断节点存在应使用
exists()函数或直接节点路径检查 - 拼写错误:
OperationaResponse多了一个字母a,正确应为OperationResponse
正确实现方式
首先需要在XQuery中声明对应的命名空间,然后通过节点路径检测目标标签是否存在。
示例1:返回布尔值(检测是否存在)
declare namespace ns0 = "urn:abcd:efgh:bc:1"; declare namespace s = "http://examplens/soap/envelope/"; let $response := xmlMessage.xml return exists($response/s:Envelope/s:Body/ns0:OperationResponse)
示例2:存在时执行指定操作
declare namespace ns0 = "urn:abcd:efgh:bc:1"; declare namespace s = "http://examplens/soap/envelope/"; let $response := xmlMessage.xml return if (exists($response/s:Envelope/s:Body/ns0:OperationResponse)) then "SomeActions" else "NoOperationResponseFound"
说明
- 必须声明XML中用到的所有命名空间(
s和ns0),否则XQuery无法识别带命名空间的节点 exists()函数用于判断指定路径下是否存在节点,返回布尔值true或false- 如果XML结构中
s:Envelope和s:Body是固定存在的,也可以简化路径为$response//ns0:OperationResponse(//表示匹配任意层级的节点)
内容的提问来源于stack exchange,提问作者Ammu1991
相关产品推荐
相关产品推荐

