Mule xpath返回DOM对象数组

时间:2014-10-13 21:06:39

标签: xpath mule

我有这个xml文件

<Collections xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
    <Collection value="bob">
        <Environments>
            <Environment>amazon</Environment>
        </Environments>
        <ContentTypes>
            <Type>Standard:ShowVideo</Type>
            <Type>Standard:VideoPlaylist</Type>
            <Type>Blog</Type>
        </ContentTypes>
    </Collection>

    <Collection value="sandy">
    <Environments>
         <Environment>amazon</Environment>
    </Environments>
    <ContentTypes>
         <Type>Blog</Type>
    </ContentTypes>
</Collection>

并在我的Mule流程中执行此xpath查询。它使用2个flowVars&#39;环境&#39;和&#39; contentType&#39;来自Redis的消息。

<set-variable variableName="collectionQuery" value="/Collections/Collection[Environments/Environment='#[environment]' and ContentTypes/Type='#[contentType]']/@value" />
<logger message="collectionQuery is #[collectionQuery]" level="INFO" /> 
<set-payload value="#[xpath(collectionQuery)]" />
<logger message="payload is #[payload]" level="INFO" />        

在这里,您可以看到完全实例化的查询和结果。

INFO] org.mule.api.processor.LoggerMessageProcessor: collectionQuery is /Collections/Collection[Environments/Environment='amazon' and ContentTypes/Type='Blog']/@value
INFO] org.mule.api.processor.LoggerMessageProcessor: payload is [org.dom4j.tree.DefaultAttribute@140207e0 [Attribute: name value value "bob"], org.dom4j.tree.DefaultAttribute@11530d63 [Attribute: name value value "sandy"]]

结果看起来像是一个包含2个org.dom4j.tree对象的数组。我只需要一个属性&#39;值&#39;的ArrayList。比如这个

[鲍勃,沙质]

我可以在Groovy中执行此操作,但不使用Mule的xpath功能。

2 个答案:

答案 0 :(得分:1)

只有这对我有用

<set-variable variableName="collectionName" value="#[payload.getText()]" doc:name="collectionName"/>
<logger message="now processing #[collectionName]" level="INFO" doc:name="Logger"/> 

答案 1 :(得分:0)

我的xpath表达式返回了一个DefaultAttribute数组。要获取属性的实际值,作为String,我需要使用foreach循环调用getValue()方法。

<foreach doc:name="For Each">
     <set-variable variableName="collectionName" value="#[payload.getValue()]" doc:name="collectionName"/>
     <logger message="now processing #[collectionName]" level="INFO" doc:name="Logger"/> 
</foreach>

输出:

INFO] org.mule.api.processor.LoggerMessageProcessor: now processing bob
INFO] org.mule.api.processor.LoggerMessageProcessor: now processing sandy