wso2 - 从属性中获取xml的值

时间:2015-07-03 15:26:47

标签: xml xpath properties wso2

我需要从xml中提取一个值并将其存储在属性中。

这是我的xml:

<?xml version="1.0" encoding="UTF-8"?>
<localEntry xmlns="http://ws.apache.org/ns/synapse" key="myVersion2">1</localEntry>

我在互联网上找到了类似的东西:

     <property name="myProp"
               expression="get-property('registry','conf:repository/myVersion2.xml')"
               scope="default"
               type="OM"/>
     <log level="custom">
        <property name="myVersion2.localEntry" expression="$ctx:myVersion2//localEntry"/>
     </log>

但不起作用..

我有这个错误:

TID: [0] [ESB] [2015-07-03 16:27:43,495] ERROR {org.apache.axis2.transport.base.threads.NativeWorkerPool} -  Uncaught exception {org.apache.axis2.transport.base.threads.NativeWorkerPool}
org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException:    ParseError at [row,col]:[1,1]
Message: Premature end of file.
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)

我需要的是获取它之间的值并将其放入属性中。

有人可以帮助我吗?

谢谢

C

4 个答案:

答案 0 :(得分:1)

请按照以下步骤更改您的配置。

  <log level="custom">
        <property name="myProp.localEntry" expression="$myProp//localEntry"/>
     </log>

请尝试一下,告诉我们是否能解决您的问题。

答案 1 :(得分:1)

上面的示例基本上是从配置注册表中获取数据(如果它已经存在)。但是你问,如何在属性中设置值。我希望XML已经存在于你的消息上下文中......所以只需遍历xpath并在属性中介中设置值,如下所示。

<property name="myProp"
           expression="\\some_element\....\localEntry"
           scope="default"
           type="String"/>

然后你可以轻松地参考这个&#34; myProp&#34;使用get-property()方法从中获取值。

答案 2 :(得分:1)

我解决了这个问题!

它有效!

        <property name="getSequence" expression="get-property('registry','conf:repository/myVersion2.xml')" scope="default" type="OM"/>
    <log level="custom">
        <property name="TestVersion" expression="$ctx:getSequence//localEntry"/>
    </log>

这是输出日志:

TID: [0] [ESB] [2015-07-07 18:04:44,251]  INFO {org.apache.synapse.mediators.builtin.LogMediator} -  TestVersion = 1 {org.apache.synapse.mediators.builtin.LogMediator}

谢谢大家的帮助!

最诚挚的问候 克劳迪奥

答案 3 :(得分:0)

我尝试应用你的建议,这是xml:

<?xml version="1.0"?> 
<soap:Envelope xmlns:soap="w3.org/2001/12/soap-envelope"    soap:encodingStyle="w3.org/2001/12/soap-encoding"> 
<soap:Body xmlns:m="example.org/stock">
<localEntry xmlns="ws.apache.org/ns/synapse" key="myVersion2">1</localEntry> 
</soap:Body> 
</soap:Envelope>

这就是我在proxyService中所拥有的:

     <property name="myProp3"
               expression="//localEntry/text()"
               scope="default"
               type="STRING"/>

     <log level="custom" separator=":">
        <property name="debug4" expression="get-property('myProp3')"/>
     </log>

但未提取值“1”

TID: [0] [ESB] [2015-07-07 16:37:39,829]  INFO {org.apache.synapse.mediators.builtin.LogMediator} -  debug4 =  {org.apache.synapse.mediators.builtin.LogMediator}

我也尝试了这个:

         <property name="myProp2" xmlns:soap="w3.org/2001/12/soap-envelope"
               expression="$body/localEntry[@key='myVersion2']/text()"
               scope="default"
               type="STRING"/>

     <log level="custom" separator=":">
        <property name="debug2" expression="get-property('myProp2')"/>
     </log>   

但结果是一样的......

错误是什么?