2016-11-27 8 views
0

DSSサービスから返された結果に含まれるデータをXPathで見つけることは非常に困難です。これは、データのサンプルが返され名前空間のためにForEachメディエータで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> 

を私は

<?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> 

あるシンプルなシナプスAPIのシーケンスを持っている私は何も結果を得ていないのです。私はそれが "エントリー"タグ内の名前空間のためであるかどうか疑問に思っています。

いずれにしても、誰かが結果を繰り返し処理する方法を教えてください。

ありがとうございました。

答えて

1

ここには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エンベロープでラップされ、以下のようになります。 callメディエーターの直後に、ワイヤログを有効にするか、<log level="full"/>を追加することでこれを確認できます。出発要素はエントリが、エンベロープはないので

<?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"> 
+0

AWESOME !!!説明と解決の両方におかげさまで、ありがとうございます。 –

1

はい、名前空間の問題である必要があります。これを試して。

<foreach description="" expression="//ns:Entries/ns:Entry" id="field" 
xmlns:ns="http://ws.wso2.org/dataservice"> 
+0

は、私はまだforeachのメディエーターの内側に発射するログメディエーターを取得していないですあなたBhathiya、 ありがとうございます。私の期待される行動は、エントリー内にエントリーがあるたびに「エントリー」という言葉を書くということです。上記を踏まえれば、これもまたあなたが期待するものでしょうか?私は見ていない別の問題はありますか? –

+1

このようなxp​​athを試してください。 '' // ns:Entries/ns:Entry '' – Bee

関連する問題