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
感謝您的建議@ophychius但這種方法也不能工作。 WSO2 Developer Studio不讓我保存中介邏輯。 它與該行有關 'var return = mc.getPayloadXML()..::(ns:return).toString();' – StO
謝謝,我也試過這種方式。你知道我可以檢查Developer Studio是否有日誌嗎? – StO
您是否嘗試用通配符替換命名空間前綴?如果它仍然會導致問題,您能分享Developer Studio爲您提供的完整錯誤/警告嗎? – ophychius