2015-01-20 99 views
0

這是我的源代碼xml示例。如何在Mule中從xml中提取節點值

<?xml version="1.0" encoding="UTF-8"?> 
<XML> 
    <Meta> 
     <Status>Success</Status> 
     <Debug></Debug> 
    </Meta> 
    <Result> 
     <Surveys> 
      <element id='0'> 
       <responses>6</responses> 
       <SurveyType>SS</SurveyType> 
       <SurveyID>SV_01C7i5l62dnKTel</SurveyID> 
       <SurveyName>Georgia Dome GS</SurveyName> 
       <SurveyDescription>Georgia Dome</SurveyDescription> 
       <SurveyOwnerID>UR_8IZEh6bVlQaF41L</SurveyOwnerID> 
       <DivisionID>DV_2cmHYrtm8C93T6J</DivisionID> 
       <SurveyStatus>Active</SurveyStatus> 
       <SurveyStartDate>0000-00-00 00:00:00</SurveyStartDate> 
       <SurveyExpirationDate>0000-00-00 00:00:00</SurveyExpirationDate> 
       <SurveyCreationDate>2014-06-18 15:14:48</SurveyCreationDate> 
       <CreatorID>UR_8IZEh6bVlQaF41L</CreatorID> 
       <LastModified>2014-10-24 14:01:23</LastModified> 
       <LastActivated>2014-06-24 09:39:23</LastActivated> 
       <GroupName>Analytics</GroupName> 
       <GroupID>GR_3kMZEX6m1IqqSjP</GroupID> 
       <UserLastName>Parrott-Sheffer</UserLastName> 
       <UserFirstName>Brandon</UserFirstName> 
      </element> 

我想打印所有進來的標籤值的列表 - <SurveyID>

以下是我的騾子流量:

</flow> 
</flow> 
<flow name="testFlow1" doc:name="testFlow1"> 
    <file:inbound-endpoint path="C:\Data\Mule\deploy\out" responseTimeout="10000" doc:name="File"/> 
    <file:file-to-string-transformer doc:name="File to String"/> 
    <logger message="*********First Message - ********* #[message.payload.toString()]" level="ERROR" doc:name="Logger"/> 
    <foreach collection="#[xpath('//XML/Result/Surveys/element')]" doc:name="For Each"> 

     <set-variable doc:name="Variable" value="#[xpath('SurveyID/text()').text]" variableName="id"/> 
     <logger level="INFO" message="********* The ID is - #[flowVars['id']]" doc:name="Logger"/> 
    </foreach> 
</flow> 

但我在控制檯上看到的結果是 -

INFO 2015年1月20日17:03:35527 [REST的API ] .testFlow1.stage1.02] org.mule.transformer.simple.AddFlowVariableTransformer:使用 「#[xpath('// SurveyID/text()')在 鍵」id「處找不到變量。 ]「。由於該值被標記爲可選,因此該變量的消息中沒有設置任何內容能夠
INFO 2015-01-2017:03:35527 [REST的API] .testFlow1.stage1.02] org.mule.api.processor.LoggerMessageProcessor:空

我正在從這個XML第三方,我注意到它沒有任何名稱空間信息。你能幫我修正我的xpath並顯示值。

我使用的騾子工作室3.5

回答

0

我不熟悉的騾,只能使用XPath。但

SurveyID/text() 

<set-variable doc:name="Variable" value="#[xpath('SurveyID/text()').text]" variableName="id"/> 

將在我看來更符合邏輯的,因爲這裏面的循環,它沒有任何意義的使用與//開始的表達式。讓我知道它是否有效。


你也應該稍微modifiy其他XPath表達式,也消除了//,那麼整個應該是

<foreach collection="#[xpath('/XML/Result/Surveys/element')]" doc:name="For Each"> 
      <set-variable doc:name="Variable" value="#[xpath('SurveyID/text()').text]" variableName="id"/> 
      <logger level="INFO" message="#[flowVars['id']]" doc:name="Logger"/> 
     </foreach> 

最後,我不知道爲什麼你選擇的文本節點,然後寫.text 。對我來說,你似乎是兩次做同樣的事情。

#[xpath('SurveyID').text] 

做什麼?

0

您正在使用的xpaths應該工作,儘管它們可以被優化。

示例XML看起來不錯過,除了缺乏三個要素收盤事實:

</Surveys> 
</Result> 
</XML> 

我的猜測是,有時它不能爲您根據輸入。我建議把

<logger message="#[message.payload]" level="ERROR" /> 

就在foreach和foreach之前。

+0

的所有值爲什麼使用''//一個for-each循環裏面工作,也就是說,檢索正確的節點?出於好奇,我不認識騾子。 – 2015-01-21 10:45:06

+0

foreach的''集合'中的xpath將提取元素集合,然後foreach將迭代每個元素。然後,'//'將從新的根元素收集,順便說就是''element'。 – 2015-01-21 11:29:57

+0

你確定'for'中的'//'沒有檢索'element'的'_outside_'節點嗎?我知道每個其他的XPath實現都是這樣的。 – 2015-01-21 11:34:22

1
我需要說你的XML是無效的,因爲它沒有結束標記由維克多 提到不管怎麼說,如果你把它正確的,那麼,你可以很容易地獲得價值的所有 SurveyID節點

第一使用XPATH3和分離器

<flow name="testFlow"> 
    <http:listener config-ref="HTTP_InboundRequest" path="/test" doc:name="HTTP"/> 
    <splitter expression="#[xpath3('//XML/Result/Surveys/element',message.payload,'NODESET')]" doc:name="Splitter"/> 
    <logger level="INFO" message="#[xpath3('SurveyID')]" doc:name="Logger"/> 
</flow> 

它會成功打印SurveyID