MULE:xpath表达式不从有效负载中提取值

时间:2015-06-15 22:29:55

标签: mule mule-studio mule-el

我有一个简单的流程,它需要一个XML消息,将其拆分为子元素,现在我试图获取一个值,但得到意想不到的结果。

我的XML看起来像这样:

> res <- sapply(split(df, df$test), function(x) sum(complete.cases(x)), USE.NAMES=FALSE)
> res <- data.frame(test=names(res), nobs=res)
> res
  test nobs
1    1    2
2    2    2

我需要从每个<?xml version="1.0" encoding="UTF-8" ?> <ns0:RewardOfferDetail xmlns:ns0="http://example.com/schemas/v1_0/RewardOffer"> <ns0:Offer> <ns0:OperationCode>U</ns0:OperationCode> </ns0:Offer> <ns0:Offer> <ns0:OperationCode>A</ns0:OperationCode> </ns0:Offer> </ns0:RewardOfferDetail>

中提取<OpeartionCode>

分割工作正常,当我在分割后注销有效负载时,它是<Offer>就好了。但后来我尝试使用这个来提取<Offer>的值:

<OperationCode>

我什么都没得到,只是一个空值,然后我尝试使用更广泛的xpath表达式:

#[xpath('/rewardsns:Offer/rewardns:OperationCode')]

结果是两个节点,这让我相信xpath函数没有看到正确的位置。但我甚至试图告诉它在哪里看,但仍然没有运气。

#[xpath('//rewardns:OperationCode')]

仍会产生两个节点。

任何建议?

流速:

#[xpath('//rewardns:OperationCode', message.payload)]
#[xpath('//rewardns:OperationCode', payload)]

输出:

    <flow name="receiveMessageFlow">
    <jms:inbound-endpoint
        queue="#{loyaltySettings.getString('loyalty.queue.receive')}"
        connector-ref="jmsConnector" doc:name="Loyalty Queue" />

    <message-filter doc:name="XSD Validation" onUnaccepted="invalidXmlMessage">
        <filter ref="schemaValidation" />
    </message-filter>

    <splitter expression="#[xpath('/rewardns:RewardOfferDetail/rewardns:Offer')]" doc:name="Split Message" />

    <set-variable variableName="action" value="#[xpath('//rewardns:OperationCode')]" doc:name="Save Action Code"/>

    <logger message="Action is: '#[flowVars.action]'" level="WARN" doc:name="Log Action Code"/>

2 个答案:

答案 0 :(得分:0)

splitter生成带有Offer DOM元素作为其有效负载的消息。

如果使用以//开头的xpath表达式,则导航回根元素,该元素仍可从Offer元素导航(因为拆分不会分离DOM节点)

因此,您需要将xpath基于以下Offer元素:

#[xpath('rewardns:OperationCode').nodeValue]

请注意,您也可以使用MEL而不是xpath来读取Offer DOM元素的内容:

<set-variable variableName="action"
    value="#[message.payload.getElementsByTagNameNS('http://example.com/schemas/v1_0/RewardOffer','OperationCode').nodeValue]"
    doc:name="Save Action Code"/>

答案 1 :(得分:0)

这似乎有效

    xpath('./rewardns:OperationCode')

从@David的解释来看,似乎xpath仍然可以访问整个文档中的元素。解决这个问题的一种方法是在表达式中使用./来锚定函数以使用当前节点作为起点。

所以最终组件如下所示:

    <set-variable variableName="action" value="#[xpath('./rewardns:OperationCode').getFirstChild().getNodeValue()]" doc:name="Save Action Code"/>