我有一个简单的流程,它需要一个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"/>
答案 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"/>