我是否缺少处理wso2esb序列中xpath表达式的步骤?

我是否缺少处理wso2esb序列中xpath表达式的步骤?,xpath,sequence,wso2esb,Xpath,Sequence,Wso2esb,我已经把这件事搞了几个小时了,我不知道问题出在哪里。现在,我只是尝试记录从代理传递到序列的XML文件的xpath表达式的结果。到目前为止,我的表达式没有任何记录。我以几种不同的方式更改了表达式和名称空间,但我无法获得显示在日志中的信息。我可以看到完整的XML文件被记录,但不能看到我试图用xpath提取的数据。当我在插件中运行xpath时,我能够很好地提取数据,因此我认为实际表达式没有问题 有人能把我推向正确的方向吗?我猜这可能是XML格式或名称空间的问题,但我不是100%确定 多谢各位 序列 &

我已经把这件事搞了几个小时了,我不知道问题出在哪里。现在,我只是尝试记录从代理传递到序列的XML文件的xpath表达式的结果。到目前为止,我的表达式没有任何记录。我以几种不同的方式更改了表达式和名称空间,但我无法获得显示在日志中的信息。我可以看到完整的XML文件被记录,但不能看到我试图用xpath提取的数据。当我在插件中运行xpath时,我能够很好地提取数据,因此我认为实际表达式没有问题

有人能把我推向正确的方向吗?我猜这可能是XML格式或名称空间的问题,但我不是100%确定

多谢各位

序列

<sequence xmlns="http://ws.apache.org/ns/synapse" name="MySequence">
<log level="custom">
  <property name="sequence" value="MySequence"></property>
</log>
<property xmlns:ns="http://org.apache.synapse/xsd" name="filename" expression="get-property('transport', 'FILE_NAME')"></property>
<log level="custom">
  <property xmlns:ns="http://org.apache.synapse/xsd" name="show-name" expression="get-property('filename')"></property>
  <property xmlns:ns="http://org.apache.synapse/xsd" name="file-name" expression="get-property('targetfilename')"></property>
</log>
<log level="custom">
  <property xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:ns="http://org.apache.synapse/xsd" xmlns:z="RowsetSchema" 
name="sequenceExp" expression="count(//xml/rs:data/z:row)"></property>
</log>
<property xmlns:ns2="http://org.apache.synapse/xsd" 
xmlns:ns="http://org.apache.synapse/xsd" 
name="transport.vfs.ReplyFileName" expression="fn:concat(get-
property('SYSTEM_DATE', 'yyMMddHHmmss'), '-', 
get-property('filename'))" 
    scope="transport"></property>
 <property name="OUT_ONLY" value="true"></property>
 <send>
  <endpoint name="FileEpr">
     <address uri="vfs:file:///var/process/rrout"></address>
  </endpoint>
 </send>
</sequence>
----------编辑 您可以通过将代理中的contentType更改为“application/xml”来解决此问题

我能想到一些事情,为什么它会破裂:

  • 您没有绑定名称空间,因此无论执行什么表达式,配置文件都不知道这些名称空间,除非它“神奇地”知道它们
  • 该工具“看到”的数据可能是实际的
    rs:data
    ,而不是包括
    xml
    根节点和整个模式的全部数据
  • 因为我不知道您使用的环境,所以让我们重写表达式,使其独立于名称空间或根元素:

    expression="count(/*//*[local-name(.) = 'data']/*[local-name(.) = 'row'])"
    

    (在结构与您显示的结构不同的情况下,在根节点之后添加<代码> //<代码>),如果失败,请考虑使用更荒谬的东西来确保XPath甚至被评估:

    expression="concat('Hello world, count words: ', //@iWordCount[1])"
    
    由于属性不在名称空间中,因此应该输出
    iWordCount
    的第一个值。如果它返回空,您就知道您认为的文档有焦点,而没有焦点。以下是查找前三个元素名称的方法:

    expression="concat('Hello: ', name(/*[1]), name(/*/*[2]), name(/*/*/*[1])"
    
    这应该输出:
    “Hello:xmlrs:data z:row”


    如果没有,它至少应该指出您实际查看的数据。

    感谢您的回复Abel。今天我又把它弄得一团糟,我注意到XML的格式在进入序列时发生了变化。我注意到它现在包含一个soap和文本标记'@john,这是因为它在Web服务调用中使用,这需要将它包装在一个有效的soap信封中。@john,我向您展示的第一个表达式将起作用,即使它周围有soap信封。这解决了你的问题吗?如果是这样的话,你可以把这个标记为答案和/或投赞成票。它不起作用。我已经试了一整天了,我能找到的两个元素是“soapenv=”和“text”。它根本就没有抓住任何其他元素。甚至当我运行firefox的xpath插件时也没有。我注意到我的代理正在将contentType设置为text/plain。我尝试将其更改为text/xml,但出现了一个错误,说明格式错误。它需要soap元素。我认为text/xml同时适用于普通xml和soap。我尝试将messageBuilder更改为“org.wso2.carbon.relay.BinaryRelayBuilder”,尝试将文件视为传递,但它仍然将xml包装在soap元素中。我正在使用VFS从目录中提取一个平面xml文件,以便处理xml元素。
    expression="concat('Hello world, count words: ', //@iWordCount[1])"
    
    expression="concat('Hello: ', name(/*[1]), name(/*/*[2]), name(/*/*/*[1])"