我正在尝试使用Filter mediator进行响应,以检查响应是否为集合。
所以我在这里做的是检查belongs_to_collection中的元素id是否为数字
<property expression="/soapenv:Envelope/soapenv:Body/root:movie/belongs_to_collection/id" name="collection" scope="default" type="STRING"/>
<filter description="" regex="[0-9]+" source="get-property('collection')">...</filter>
这是我的完整api配置 http://pastebin.com/QA3GCd1W
这里是过滤器的响应 http://pastebin.com/0dxweJu3
答案 0 :(得分:2)
如果在表达式中使用名称空间前缀,则需要定义这些名称空间。例如:
<property expression="/root:movie/belongs_to_collection/id"
name="collection" scope="default" type="STRING" xmlns:root="www.wso2esb.com"/>
我在使用您的API时看到的响应是
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<jsonObject>
<belongs_to_collection>
<id>8650</id>
...
你的根元素是soapenv:Envelope标签,所以你不必再把它放在你的表达式中了。 /开头是指根元素。之后的任何内容都会引用根元素中的元素。
所以表达式应该如下:
<property xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
name="collection" expression="/soapenv:Body/jsonObject/belongs_to_collection/id"
scope="default" type="STRING"/>
答案 1 :(得分:2)
如果您不想处理命名空间,可以像这样使用local-name()
。
<property name="collection"
expression="//*[local-name()='belongs_to_collection']/*[local-name()='id']/text()"
scope="default"
type="STRING"/>