迭代调解器的 wso2esb 问题
wso2esb issue with iterate mediator
我是 WSO2 和 XML/XPath 的新手,我在使用迭代调解器表达式时遇到了问题。我的情况如下。我得到了一个 .csv 文件,然后使用 Smooks 调解器和简单的 XSLT 转换将其转换为 XML - 两者都工作正常,我之前测试过它们。此过程的结果具有以下结构(并由 esb 放入 SOAP 环境中):
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Orderlist xmlns="http://ws.apache.org/ns/synapse">
<Order>
<Nr>1234</Nr>
<Sender>
<!-- some child elements here -->>
</Sender>
<Recipient>
<!-- some child elements here -->
</Recipient>
</Order>
<Order> <!-- same as above -->
</Order>
<!-- more orders here -->
</Orderlist>
</soapenv:Body>
</soapenv:Envelope>
现在我使用以下代理执行我的转换,然后遍历 Order 元素:
<proxy name="Aufgabe3Proxy" startOnLoad="true" trace="disable"
transports="https http vfs" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<!-- transformations are done here, producing the above message -->
<iterate expression="$body/Orderlist/Order" preservePayload="true">
<target>
<sequence>
<log level="full"/>
<send>
<property expression="$body/Order/Start/text()"
name="uri.var.loc1" scope="default" type="STRING"/>
<property expression="$body/Order/Ziel/text()"
name="uri.var.loc2" scope="default" type="STRING"/>
<endpoint key="MapsEndpoint"/>
</send>
</sequence>
</target>
</iterate>
</inSequence>
<outSequence>
<log level="full"/>
<aggregate>
<onComplete expression="//Orderlist">
<property name="transport.vfs.ReplyFileName" scope="transport"
type="STRING" value="responses-out.xml"/>
<property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
<send/>
</onComplete>
</aggregate>
</outSequence>
<faultSequence/>
</target>
<parameter name="transport.PollInterval">5</parameter>
<parameter name="transport.vfs.FileURI">file://C:\Users\admin\Desktop\Daten\MapsPaare\in</parameter>
<parameter name="transport.vfs.ContentType">text/plain</parameter>
<parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
<parameter name="transport.vfs.MoveAfterFailure">file://C:\Users\admin\Desktop\Daten\MapsPaare\fail</parameter>
<parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
<parameter name="transport.vfs.FileNamePattern">.*.csv</parameter>
<parameter name="transport.vfs.MoveAfterProcess">file://C:\Users\admin\Desktop\Daten\MapsPaare\out1</parameter>
</proxy>
当我 运行 这样做并将我的 .csv 放入 in-folger 时,日志仅打印读取的消息和转换的结果,仅此而已。它也不会写入 Responses-out.xml 文件(也不会创建它)。
你能指出我在这里犯的错误吗?
编辑:
到目前为止我尝试过的一件事是:由于 ESB 将我的订单列表放入命名空间,我尝试像这样调整我的迭代表达式:
<iterate expression="$body/OL:Orderlist/OL:Auftrag" preservePayload="true"
xmlns:OL="http://ws.apache.org/ns/synapse">
但是,当这是 运行 时,日志会给我一条错误消息:"SynapseXPath Evaluation of the XPath expression $body/OL:Auftragsliste/OL:Auftrag resulted in an error" 并指出它无法解析名称空间前缀 OL。
您在编辑中尝试的做法是个好方法。不知道为什么节点 'order' 变成 'Auftrag',但这个迭代必须工作:
<iterate expression="$body/OL:Orderlist/OL:Order" preservePayload="true" xmlns:OL="http://ws.apache.org/ns/synapse">
验证 ESB 日志中的错误是否来自中介的另一部分
只是为了有一个明确的答案:解决方案就像我在上面的评论中写的那样。正在替换
<iterate expression="$body/Orderlist/Order" preservePayload="true">
<target>
<sequence>
<log level="full"/>
<send>
<property expression="$body/Order/Start/text()"
name="uri.var.loc1" scope="default" type="STRING"/>
<property expression="$body/Order/Ziel/text()"
name="uri.var.loc2" scope="default" type="STRING"/>
<endpoint key="MapsEndpoint"/>
</send>
</sequence>
</target>
</iterate>
和
<iterate xmlns:OL="http://ws.apache.org/ns/synapse" expression="//OL:Orderlist/OL:Order" preservePayload="true">
<target>
<sequence>
<log level="full"/>
<send>
<property expression="//OL:Order/OL:Start"
name="uri.var.loc1" scope="default" type="STRING"/>
<property expression="//OL:Order/OL:Ziel"
name="uri.var.loc2" scope="default" type="STRING"/>
<endpoint key="MapsEndpoint"/>
</send>
</sequence>
</target>
</iterate>
确实解决了问题。
我是 WSO2 和 XML/XPath 的新手,我在使用迭代调解器表达式时遇到了问题。我的情况如下。我得到了一个 .csv 文件,然后使用 Smooks 调解器和简单的 XSLT 转换将其转换为 XML - 两者都工作正常,我之前测试过它们。此过程的结果具有以下结构(并由 esb 放入 SOAP 环境中):
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Orderlist xmlns="http://ws.apache.org/ns/synapse">
<Order>
<Nr>1234</Nr>
<Sender>
<!-- some child elements here -->>
</Sender>
<Recipient>
<!-- some child elements here -->
</Recipient>
</Order>
<Order> <!-- same as above -->
</Order>
<!-- more orders here -->
</Orderlist>
</soapenv:Body>
</soapenv:Envelope>
现在我使用以下代理执行我的转换,然后遍历 Order 元素:
<proxy name="Aufgabe3Proxy" startOnLoad="true" trace="disable"
transports="https http vfs" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<!-- transformations are done here, producing the above message -->
<iterate expression="$body/Orderlist/Order" preservePayload="true">
<target>
<sequence>
<log level="full"/>
<send>
<property expression="$body/Order/Start/text()"
name="uri.var.loc1" scope="default" type="STRING"/>
<property expression="$body/Order/Ziel/text()"
name="uri.var.loc2" scope="default" type="STRING"/>
<endpoint key="MapsEndpoint"/>
</send>
</sequence>
</target>
</iterate>
</inSequence>
<outSequence>
<log level="full"/>
<aggregate>
<onComplete expression="//Orderlist">
<property name="transport.vfs.ReplyFileName" scope="transport"
type="STRING" value="responses-out.xml"/>
<property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
<send/>
</onComplete>
</aggregate>
</outSequence>
<faultSequence/>
</target>
<parameter name="transport.PollInterval">5</parameter>
<parameter name="transport.vfs.FileURI">file://C:\Users\admin\Desktop\Daten\MapsPaare\in</parameter>
<parameter name="transport.vfs.ContentType">text/plain</parameter>
<parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
<parameter name="transport.vfs.MoveAfterFailure">file://C:\Users\admin\Desktop\Daten\MapsPaare\fail</parameter>
<parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
<parameter name="transport.vfs.FileNamePattern">.*.csv</parameter>
<parameter name="transport.vfs.MoveAfterProcess">file://C:\Users\admin\Desktop\Daten\MapsPaare\out1</parameter>
</proxy>
当我 运行 这样做并将我的 .csv 放入 in-folger 时,日志仅打印读取的消息和转换的结果,仅此而已。它也不会写入 Responses-out.xml 文件(也不会创建它)。 你能指出我在这里犯的错误吗?
编辑: 到目前为止我尝试过的一件事是:由于 ESB 将我的订单列表放入命名空间,我尝试像这样调整我的迭代表达式:
<iterate expression="$body/OL:Orderlist/OL:Auftrag" preservePayload="true"
xmlns:OL="http://ws.apache.org/ns/synapse">
但是,当这是 运行 时,日志会给我一条错误消息:"SynapseXPath Evaluation of the XPath expression $body/OL:Auftragsliste/OL:Auftrag resulted in an error" 并指出它无法解析名称空间前缀 OL。
您在编辑中尝试的做法是个好方法。不知道为什么节点 'order' 变成 'Auftrag',但这个迭代必须工作:
<iterate expression="$body/OL:Orderlist/OL:Order" preservePayload="true" xmlns:OL="http://ws.apache.org/ns/synapse">
验证 ESB 日志中的错误是否来自中介的另一部分
只是为了有一个明确的答案:解决方案就像我在上面的评论中写的那样。正在替换
<iterate expression="$body/Orderlist/Order" preservePayload="true">
<target>
<sequence>
<log level="full"/>
<send>
<property expression="$body/Order/Start/text()"
name="uri.var.loc1" scope="default" type="STRING"/>
<property expression="$body/Order/Ziel/text()"
name="uri.var.loc2" scope="default" type="STRING"/>
<endpoint key="MapsEndpoint"/>
</send>
</sequence>
</target>
</iterate>
和
<iterate xmlns:OL="http://ws.apache.org/ns/synapse" expression="//OL:Orderlist/OL:Order" preservePayload="true">
<target>
<sequence>
<log level="full"/>
<send>
<property expression="//OL:Order/OL:Start"
name="uri.var.loc1" scope="default" type="STRING"/>
<property expression="//OL:Order/OL:Ziel"
name="uri.var.loc2" scope="default" type="STRING"/>
<endpoint key="MapsEndpoint"/>
</send>
</sequence>
</target>
</iterate>
确实解决了问题。