2015-07-03 149 views
0

我需要从xml中提取值并将其存储在属性中。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) 

我需要什么是要获得价值,并把它放在一个属性..

有人能帮我吗?

谢谢

你ç

+0

我需要的是读/从XML – ClaudioM

回答

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} 

谢谢大家对我的帮助!

问候 克劳迪奥

1

请改变你的配置如下。

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

请试试看,并告诉我们是否解决了您的问题。

+0

拉温德拉喜提取值“1”,我想你的建议,但我有一个例外:TID:[0] [ESB] [ 2015-07-06 14:09:43,631] ERROR {org.apache.synapse.util.xpath.SynapseXPath} - 评估XPath表达式$ myProp // localEntry导致错误{org.apache.synapse.util.xpath .SynapseXPath} org.jaxen.UnresolvableException:变量myProp – ClaudioM

1

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

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

那么你可以很容易地引用这个“myProp”从它获取值使用get-property()方法。

+0

正确的sintax是表达式=“// localEntry”,但在任何情况下,这不起作用 – ClaudioM

+0

yes是正确的,但你的xml不符合SOAP消息的标准和wso2只有了解肥皂....所以只是你的XML像下面的形式。 AriSan

+1

是的正确,但是你的xml不符合SOAP消息的标准,并且wso2只能理解soap ....所以你只需要像下面这样的表单。 <?xml version =“1.0”?> 1 AriSan

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> 

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

这是什么错误?