无法使用ForEach中介从DSS迭代结果可能是由于名称空间

时间:2016-11-27 14:19:55

标签: xpath wso2 wso2esb

我在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;标签

无论如何,有人可以帮助我如何迭代结果吗?

感谢。

2 个答案:

答案 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">