У меня большие трудности с поиском 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>

Я не получаю никаких результатов. Мне интересно, не из-за ли это пространства имен в теге «Entries».

В любом случае, не мог бы кто-нибудь помочь мне с повторением результатов?

Спасибо.

0
Raging Llama 27 Ноя 2016 в 17:19

2 ответа

Лучший ответ

Здесь есть две вещи. 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, а Envelope.

Пожалуйста, используйте следующую конфигурацию (с //) вместо этого, где элемент Entries будет сопоставляться везде, где он появляется в полезной нагрузке.

<foreach xmlns:ns="http://ws.wso2.org/dataservice" id="field" expression="//ns:Entries/ns:Entry">
2
maheeka 27 Ноя 2016 в 17:16

Да, это должно быть проблема с пространством имен. Попробуй это.

<foreach description="" expression="//ns:Entries/ns:Entry" id="field"
xmlns:ns="http://ws.wso2.org/dataservice">
1
Bee 27 Ноя 2016 в 17:43