我在XPath中查找从DSS服务返回的结果中的任何数据时遇到了很大的困难。
这是返回数据的示例:
<?xml version='1.0' encoding='utf-8'?>
<Entries xmlns="http://ws.wso2.org/dataservice">
<Entry>
<FirstName>Sandra</FirstName>
<LastName>Carr</LastName>
<FlightDate>2016-07-23T18:24:12.000-04:00</FlightDate>
<Duration>2.8</Duration>
<FlightEndTime>2016-07-23T21:24:12.000-04:00</FlightEndTime>
</Entry>
<Entry>
<FirstName>Lawrence</FirstName>
<LastName>Day</LastName>
<FlightDate>2016-07-23T18:02:21.000-04:00</FlightDate>
<Duration>2.8</Duration>
<FlightEndTime>2016-07-23T21:02:21.000-04:00</FlightEndTime>
</Entry>
我有一个简单的突触API序列
<?xml version="1.0" encoding="UTF-8"?>
<api context="/pilots" name="GetPilots" xmlns="http://ws.apache.org/ns/synapse">
<resource methods="GET">
<inSequence>
<call>
<endpoint key="GetPilotsRestEndpoint"/>
</call>
<foreach description="" expression="/Entries/Entry" id="field">
<sequence>
<log description="" level="custom">
<property name="tag" value="Entry"/>
</log>
</sequence>
</foreach>
<log level="full"/>
<respond/>
</inSequence>
<outSequence/>
<faultSequence/>
</resource>
我没有得到任何结果。我想知道是否是因为&#34; Entries&#34;标签
无论如何,有人可以帮助我如何迭代结果吗?
感谢。
答案 0 :(得分:1)
是的,它必须是命名空间问题。试试这个。
<foreach description="" expression="//ns:Entries/ns:Entry" id="field"
xmlns:ns="http://ws.wso2.org/dataservice">
答案 1 :(得分:1)
这里有两件事。
1.您的有效负载具有名称空间http://ws.wso2.org/dataservice
,您需要将其添加到XPath
2.后端的响应如下所示。
<Entries xmlns="http://ws.wso2.org/dataservice">
<Entry>
<FirstName>Sandra</FirstName>
<LastName>Carr</LastName>
<FlightDate>2016-07-23T18:24:12.000-04:00</FlightDate>
<Duration>2.8</Duration>
<FlightEndTime>2016-07-23T21:24:12.000-04:00</FlightEndTime>
</Entry>
<Entry>
<FirstName>Lawrence</FirstName>
<LastName>Day</LastName>
<FlightDate>2016-07-23T18:02:21.000-04:00</FlightDate>
<Duration>2.8</Duration>
<FlightEndTime>2016-07-23T21:02:21.000-04:00</FlightEndTime>
</Entry>
但是,当它到达ESB时,它会被SOAP信封包裹起来,如下所示。您可以通过启用有线日志或在<log level="full"/>
介体后添加call
来验证这一点。
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Entries xmlns="http://ws.wso2.org/dataservice">
<Entry>
<FirstName>Sandra</FirstName>
<LastName>Carr</LastName>
<FlightDate>2016-07-23T18:24:12.000-04:00</FlightDate>
<Duration>2.8</Duration>
<FlightEndTime>2016-07-23T21:24:12.000-04:00</FlightEndTime>
</Entry>
<Entry>
<FirstName>Lawrence</FirstName>
<LastName>Day</LastName>
<FlightDate>2016-07-23T18:02:21.000-04:00</FlightDate>
<Duration>2.8</Duration>
<FlightEndTime>2016-07-23T21:02:21.000-04:00</FlightEndTime>
</Entry>
</Entries>
</soapenv:Body>
</soapenv:Envelope>
因此,您的XPath /Entries/Entry
将不起作用,因为起始元素不是条目而是信封。
请使用以下配置(使用//
),而不是将Entries
元素匹配到有效负载中的任何位置。
<foreach xmlns:ns="http://ws.wso2.org/dataservice" id="field" expression="//ns:Entries/ns:Entry">