2015-07-03 187 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> 

但是結果是一樣的......

這是什麼錯誤?