2017-06-01 60 views
0

您好我想要使用腳本中介做一個SOAP - > JSON改造WSO2 - Script Mediator使用getPayloadXML()的XML屬性檢索;

<ns:getTestMethodResponse xmlns:ns="http://main.wsmediator"> 
<ns:return>getTestMethod is called</ns:return> 
</ns:getTestMethodResponse> 

這是我從我創建的測試服務接收響應的一部分。問題是我無法獲得WO2 ESB文檔中提到的元素數據。 這是

mc.getPayloadXML()..::return.toString(); 

我甚至試過

mc.getPayloadXML()..::ns:return.toString(); 

我在做什麼錯在這裏? 欣賞幫助。

回答

1

E4X是可識別名稱空間的,所以要訪問非默認名稱空間中的元素,您需要聲明名稱空間/前綴或使用通配符*。

編輯:在ESB本身的一些調試表明,我們不能使用單詞「返回」。這是一個保留字,並且不允許,甚至不作爲查詢字符串的一部分從xml中檢索「return」元素。

讓我們假設一個該元素被稱爲「價值」來代替,那麼代碼將編譯和工作如下時刻:

var ns = new Namespace('http://main.wsmediator'); 
var xmlValue = mc.getPayloadXML()..ns::value.toString(); 

另一種方法是使用通配符:

var return = mc.getPayloadXML()..*::value.toString(); 

但是,將xml有效負載更改爲遵循JavaScript標準並不是一個非常漂亮的方法,也可能不是一個可行的解決方案。相反,我們可以嘗試以另一種方式訪問​​元素。

<inSequence> 
     <script language="js"> 
      var ns = new Namespace('http://main.wsmediator'); 
      var value = mc.getPayloadXML().*.toString(); 
      mc.setProperty("Asterisk", value); 
     </script> 
     <log> 
      <property name="Asterisk" expression="get- 
       property('Asterisk')"/> 
     </log> 
     <respond/> 
</inSequence> 

的getTestMethodResponse元素是根元素,當你做mc.getPayloadXML(),星號給你這個元素的兒童。這有效,但不是很漂亮,因爲它基於對消息結構的一些假設。

另一種選擇可能是完全放棄使用腳本介體並改用PayloadFactory。例如:

<payloadFactory media-type="json"> 
     <format> 
      {"return":"$1"} 
     </format> 
     <args> 
     <arg xmlns:ns="http://main.wsmediator" 
        evaluator="xml" 
        expression="//ns:return"/> 
     </args> 
</payloadFactory> 

更多關於E4X,檢查here 更多關於PayloadFactoryMediator檢查here

+0

感謝您的建議@ophychius但這種方法也不能工作。 WSO2 Developer Studio不讓我保存中介邏輯。 它與該行有關 'var return = mc.getPayloadXML()..::(ns:return).toString();' – StO

+0

謝謝,我也試過這種方式。你知道我可以檢查Developer Studio是否有日誌嗎? – StO

+0

您是否嘗試用通配符替換命名空間前綴?如果它仍然會導致問題,您能分享Developer Studio爲您提供的完整錯誤/警告嗎? – ophychius