WSO2 - 使用getPayloadXML()的Script Mediator XML属性检索;

时间:2017-06-01 03:45:07

标签: wso2esb esb synapse

您好我正在尝试使用Script Mediator来执行SOAP - > JSON转换

<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 个答案:

答案 0 :(得分:1)

E4X可识别名称空间,因此要访问非默认名称空间中的元素,您需要声明名称空间/前缀或使用通配符*。

编辑:ESB中的一些调试本身告诉我,我们不能使用&#34; return&#34;这个词。这是一个保留字,不允许,甚至不作为查询字符串的一部分来检索&#34; return&#34;来自xml的元素。

让我们暂时假设元素被调用&#34;值&#34;相反,然后代码将编译并按如下方式工作:

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>

当你执行mc.getPayloadXML()时,getTestMethodResponse元素是根元素,星号为你提供了这个元素的子元素。这可行,但不是很漂亮,因为它基于对消息结构的一些假设。

另一个选择可能是完全放弃使用脚本调解器并使用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