MULE:xpath 表达式未从有效负载中提取值
MULE: xpath expression not extracting values from payload
我有一个简单的流程,它需要一个 XML 消息,将其拆分为子元素,现在我试图获取一个值,但得到了意想不到的结果。
我的 XML 看起来像这样:
<?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>
我需要从每个 <Offer>
中提取 <OpeartionCode>
拆分工作正常,当我在拆分后注销负载时,<Offer>
就好了。但后来我尝试使用以下方法提取 <OperationCode>
的值:
#[xpath('/rewardsns:Offer/rewardns:OperationCode')]
我什么也没得到,只有一个空值,然后我尝试使用更广泛的 xpath 表达式:
#[xpath('//rewardns:OperationCode')]
结果是两个节点,这让我相信 xpath 函数没有找到正确的位置。但我什至试图告诉它去哪里看,但仍然没有运气。
#[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"/>
输出:
13:53:39,653 DEBUG [org.mule.transport.jms.MultiConsumerJmsMessageReceiver] (TIBCO EMS Session Dispatcher (741)) Message received it is of type: TibjmsTextMessage
13:53:39,653 DEBUG [org.mule.transport.jms.MultiConsumerJmsMessageReceiver] (TIBCO EMS Session Dispatcher (741)) Message received on Queue[M.ESS.ITM.LOYALTY.STARS.ItemMaint] (com.tibco.tibjms.TibjmsQueue)
13:53:39,653 DEBUG [org.mule.transport.jms.MultiConsumerJmsMessageReceiver] (TIBCO EMS Session Dispatcher (741)) Message CorrelationId is:
13:53:39,653 DEBUG [org.mule.transport.jms.MultiConsumerJmsMessageReceiver] (TIBCO EMS Session Dispatcher (741)) Jms Message Id is: ID:EMS-SERVER.A305502CE7A4:995
13:53:39,653 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Applying transformer JMSMessageToObject#218219976 (org.mule.transport.jms.transformers.JMSMessageToObject)
13:53:39,653 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Object before transform:
org.mule.DefaultMuleMessage
{
id=998d2f50-13a0-11e5-b0f9-ac87a31af20c
payload=com.tibco.tibjms.TibjmsTextMessage
correlationId=
correlationGroup=-1
correlationSeq=-1
encoding=UTF-8
exceptionPayload=<not set>
Message properties:
INVOCATION scoped properties:
INBOUND scoped properties:
JMSCorrelationID=
JMSDeliveryMode=1
JMSDestination=Queue[M.ESS.ITM.LOYALTY.STARS.ItemMaint]
JMSExpiration=0
JMSMessageID=ID:EMS-SERVER.A305502CE7A4:995
JMSPriority=4
JMSRedelivered=false
JMSTimestamp=1426256459016
JMSType=
MULE_CORRELATION_ID=
MULE_MESSAGE_ID=ID:EMS-SERVER.A305502CE7A4:995
OUTBOUND scoped properties:
MULE_ENCODING=UTF-8
SESSION scoped properties:
}
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Source object is TibjmsTextMessage
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Message type received is: TibjmsTextMessage
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Resulting object is String
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Object after transform: <?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>
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) The transformed object is of expected type. Type is: String
13:53:39,669 DEBUG [org.mule.expression.DefaultExpressionManager] ([loyalty-nebula].receiveMessageFlow.stage1.02) Result of expression: xpath-branch:/rewardns:RewardOfferDetail/rewardns:Offer is: [[ns0:Offer: null], [ns0:Offer: null]]
13:53:39,669 DEBUG [org.mule.processor.chain.DefaultMessageProcessorChain] ([loyalty-nebula].receiveMessageFlow.stage1.02) Invoking DefaultMessageProcessorChain '(inner iterating chain) of 'receiveMessageFlow' processor chain'
[
AddFlowVariableTransformer{this=589f1380, name='AddFlowVariableTransformer', ignoreBadInput=false, returnClass=SimpleDataType{type=java.lang.Object, mimeType='*/*'}, sourceTypes=[SimpleDataType{type=java.lang.Object, mimeType='*/*'}]},
org.mule.api.processor.LoggerMessageProcessor@be3c4ce,
org.mule.routing.requestreply.AsyncReplyToPropertyRequestReplyReplier
] with event MuleEvent: 0-998d2f53-13a0-11e5-b0f9-ac87a31af20c, stop processing=false, jms://M.ESS.ITM.LOYALTY.STARS.ItemMaint
13:53:39,669 DEBUG [org.mule.transformer.simple.AddFlowVariableTransformer] ([loyalty-nebula].receiveMessageFlow.stage1.02) Applying transformer AddFlowVariableTransformer (org.mule.transformer.simple.AddFlowVariableTransformer)
13:53:39,670 DEBUG [org.mule.transformer.simple.AddFlowVariableTransformer] ([loyalty-nebula].receiveMessageFlow.stage1.02) Object before transform:
org.mule.DefaultMuleMessage
{
id=998fa050-13a0-11e5-b0f9-ac87a31af20c
payload=org.apache.xerces.dom.ElementNSImpl
correlationId=<not set>
correlationGroup=2
correlationSeq=1
encoding=UTF-8
exceptionPayload=<not set>
Message properties:
INVOCATION scoped properties:
INBOUND scoped properties:
OUTBOUND scoped properties:
MULE_CORRELATION_GROUP_SIZE=2
MULE_CORRELATION_SEQUENCE=1
MULE_ENCODING=UTF-8
SESSION scoped properties:
}
13:53:39,670 DEBUG [org.mule.expression.DefaultExpressionManager] ([loyalty-nebula].receiveMessageFlow.stage1.02) Result of expression: xpath-branch://rewardns:OperationCode is: [[ns0:OperationCode: null], [ns0:OperationCode: null]]
13:53:39,670 DEBUG [org.mule.transformer.simple.AddFlowVariableTransformer] ([loyalty-nebula].receiveMessageFlow.stage1.02) Object after transform:
org.mule.DefaultMuleMessage
{
id=998fa050-13a0-11e5-b0f9-ac87a31af20c
payload=org.apache.xerces.dom.ElementNSImpl
correlationId=<not set>
correlationGroup=2
correlationSeq=1
encoding=UTF-8
exceptionPayload=<not set>
Message properties:
INVOCATION scoped properties:
action=[[ns0:OperationCode: null], [ns0:OperationCode: null]]
INBOUND scoped properties:
OUTBOUND scoped properties:
MULE_CORRELATION_GROUP_SIZE=2
MULE_CORRELATION_SEQUENCE=1
MULE_ENCODING=UTF-8
SESSION scoped properties:
}
13:53:39,671 DEBUG [org.mule.transformer.simple.AddFlowVariableTransformer] ([loyalty-nebula].receiveMessageFlow.stage1.02) The transformed object is of expected type. Type is: DefaultMuleMessage
13:53:39,672 WARN [org.mule.api.processor.LoggerMessageProcessor] ([loyalty-nebula].receiveMessageFlow.stage1.02) Action is: '[[ns0:OperationCode: null], [ns0:OperationCode: null]]'
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"/>
这似乎有效
xpath('./rewardns:OperationCode')
从@David 的解释来看,xpath 似乎仍然可以访问整个文档中的元素。解决这个问题的一种方法是在表达式中使用 ./
来锚定函数以使用当前节点作为起点。
所以最后的组件看起来像这样:
<set-variable variableName="action" value="#[xpath('./rewardns:OperationCode').getFirstChild().getNodeValue()]" doc:name="Save Action Code"/>
我有一个简单的流程,它需要一个 XML 消息,将其拆分为子元素,现在我试图获取一个值,但得到了意想不到的结果。
我的 XML 看起来像这样:
<?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>
我需要从每个 <Offer>
<OpeartionCode>
拆分工作正常,当我在拆分后注销负载时,<Offer>
就好了。但后来我尝试使用以下方法提取 <OperationCode>
的值:
#[xpath('/rewardsns:Offer/rewardns:OperationCode')]
我什么也没得到,只有一个空值,然后我尝试使用更广泛的 xpath 表达式:
#[xpath('//rewardns:OperationCode')]
结果是两个节点,这让我相信 xpath 函数没有找到正确的位置。但我什至试图告诉它去哪里看,但仍然没有运气。
#[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"/>
输出:
13:53:39,653 DEBUG [org.mule.transport.jms.MultiConsumerJmsMessageReceiver] (TIBCO EMS Session Dispatcher (741)) Message received it is of type: TibjmsTextMessage
13:53:39,653 DEBUG [org.mule.transport.jms.MultiConsumerJmsMessageReceiver] (TIBCO EMS Session Dispatcher (741)) Message received on Queue[M.ESS.ITM.LOYALTY.STARS.ItemMaint] (com.tibco.tibjms.TibjmsQueue)
13:53:39,653 DEBUG [org.mule.transport.jms.MultiConsumerJmsMessageReceiver] (TIBCO EMS Session Dispatcher (741)) Message CorrelationId is:
13:53:39,653 DEBUG [org.mule.transport.jms.MultiConsumerJmsMessageReceiver] (TIBCO EMS Session Dispatcher (741)) Jms Message Id is: ID:EMS-SERVER.A305502CE7A4:995
13:53:39,653 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Applying transformer JMSMessageToObject#218219976 (org.mule.transport.jms.transformers.JMSMessageToObject)
13:53:39,653 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Object before transform:
org.mule.DefaultMuleMessage
{
id=998d2f50-13a0-11e5-b0f9-ac87a31af20c
payload=com.tibco.tibjms.TibjmsTextMessage
correlationId=
correlationGroup=-1
correlationSeq=-1
encoding=UTF-8
exceptionPayload=<not set>
Message properties:
INVOCATION scoped properties:
INBOUND scoped properties:
JMSCorrelationID=
JMSDeliveryMode=1
JMSDestination=Queue[M.ESS.ITM.LOYALTY.STARS.ItemMaint]
JMSExpiration=0
JMSMessageID=ID:EMS-SERVER.A305502CE7A4:995
JMSPriority=4
JMSRedelivered=false
JMSTimestamp=1426256459016
JMSType=
MULE_CORRELATION_ID=
MULE_MESSAGE_ID=ID:EMS-SERVER.A305502CE7A4:995
OUTBOUND scoped properties:
MULE_ENCODING=UTF-8
SESSION scoped properties:
}
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Source object is TibjmsTextMessage
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Message type received is: TibjmsTextMessage
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Resulting object is String
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) Object after transform: <?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>
13:53:39,654 DEBUG [org.mule.transport.jms.transformers.JMSMessageToObject] (TIBCO EMS Session Dispatcher (741)) The transformed object is of expected type. Type is: String
13:53:39,669 DEBUG [org.mule.expression.DefaultExpressionManager] ([loyalty-nebula].receiveMessageFlow.stage1.02) Result of expression: xpath-branch:/rewardns:RewardOfferDetail/rewardns:Offer is: [[ns0:Offer: null], [ns0:Offer: null]]
13:53:39,669 DEBUG [org.mule.processor.chain.DefaultMessageProcessorChain] ([loyalty-nebula].receiveMessageFlow.stage1.02) Invoking DefaultMessageProcessorChain '(inner iterating chain) of 'receiveMessageFlow' processor chain'
[
AddFlowVariableTransformer{this=589f1380, name='AddFlowVariableTransformer', ignoreBadInput=false, returnClass=SimpleDataType{type=java.lang.Object, mimeType='*/*'}, sourceTypes=[SimpleDataType{type=java.lang.Object, mimeType='*/*'}]},
org.mule.api.processor.LoggerMessageProcessor@be3c4ce,
org.mule.routing.requestreply.AsyncReplyToPropertyRequestReplyReplier
] with event MuleEvent: 0-998d2f53-13a0-11e5-b0f9-ac87a31af20c, stop processing=false, jms://M.ESS.ITM.LOYALTY.STARS.ItemMaint
13:53:39,669 DEBUG [org.mule.transformer.simple.AddFlowVariableTransformer] ([loyalty-nebula].receiveMessageFlow.stage1.02) Applying transformer AddFlowVariableTransformer (org.mule.transformer.simple.AddFlowVariableTransformer)
13:53:39,670 DEBUG [org.mule.transformer.simple.AddFlowVariableTransformer] ([loyalty-nebula].receiveMessageFlow.stage1.02) Object before transform:
org.mule.DefaultMuleMessage
{
id=998fa050-13a0-11e5-b0f9-ac87a31af20c
payload=org.apache.xerces.dom.ElementNSImpl
correlationId=<not set>
correlationGroup=2
correlationSeq=1
encoding=UTF-8
exceptionPayload=<not set>
Message properties:
INVOCATION scoped properties:
INBOUND scoped properties:
OUTBOUND scoped properties:
MULE_CORRELATION_GROUP_SIZE=2
MULE_CORRELATION_SEQUENCE=1
MULE_ENCODING=UTF-8
SESSION scoped properties:
}
13:53:39,670 DEBUG [org.mule.expression.DefaultExpressionManager] ([loyalty-nebula].receiveMessageFlow.stage1.02) Result of expression: xpath-branch://rewardns:OperationCode is: [[ns0:OperationCode: null], [ns0:OperationCode: null]]
13:53:39,670 DEBUG [org.mule.transformer.simple.AddFlowVariableTransformer] ([loyalty-nebula].receiveMessageFlow.stage1.02) Object after transform:
org.mule.DefaultMuleMessage
{
id=998fa050-13a0-11e5-b0f9-ac87a31af20c
payload=org.apache.xerces.dom.ElementNSImpl
correlationId=<not set>
correlationGroup=2
correlationSeq=1
encoding=UTF-8
exceptionPayload=<not set>
Message properties:
INVOCATION scoped properties:
action=[[ns0:OperationCode: null], [ns0:OperationCode: null]]
INBOUND scoped properties:
OUTBOUND scoped properties:
MULE_CORRELATION_GROUP_SIZE=2
MULE_CORRELATION_SEQUENCE=1
MULE_ENCODING=UTF-8
SESSION scoped properties:
}
13:53:39,671 DEBUG [org.mule.transformer.simple.AddFlowVariableTransformer] ([loyalty-nebula].receiveMessageFlow.stage1.02) The transformed object is of expected type. Type is: DefaultMuleMessage
13:53:39,672 WARN [org.mule.api.processor.LoggerMessageProcessor] ([loyalty-nebula].receiveMessageFlow.stage1.02) Action is: '[[ns0:OperationCode: null], [ns0:OperationCode: null]]'
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"/>
这似乎有效
xpath('./rewardns:OperationCode')
从@David 的解释来看,xpath 似乎仍然可以访问整个文档中的元素。解决这个问题的一种方法是在表达式中使用 ./
来锚定函数以使用当前节点作为起点。
所以最后的组件看起来像这样:
<set-variable variableName="action" value="#[xpath('./rewardns:OperationCode').getFirstChild().getNodeValue()]" doc:name="Save Action Code"/>