我试图通过提取有效负载XML的一部分来设置变量。但是此xpath表达式仅适用于简单的子节点,但不适用于具有子节点的元素。
预期:需要记录' cde'的所有子节点。以下请求XML的元素。 两种方法都不起作用。
<logger level="INFO" message=" approach1: #[xpath://*[local-name()='abc']/*[local-name()='cde']]" />
<logger level="INFO" message=" approach2: #[xpath('//abc/cde/node()').text]" />
输入XML:
<abc>
<def>def123</def>
<cde>
<ghf>ghf123</ghf>
</cde>
</abc>
除了使用XSLT之外,还有其他方法可以提取xml的一部分吗?可以使用groovy评估器吗?
编辑: 预期:cde元素的所有内容都是必需的。
答案 0 :(得分:2)
我不熟悉Mule,但是
的XPath表达式&#39; cde&#39;的所有子节点元件
是&#34;所有子节点&#34;你的意思是所有元素子节点:
"//cde/*"
否则,如果您真的想要任何类型的节点:
"//cde/node()"
答案 1 :(得分:0)
我认为提取价值并不存在问题。
您可以使用#[xpath://.[xpath:local-name()='abc']/*[xpath:local-name()='cde']/*[xpath:local-name()='ghf']]
来提取 ghf 的值。
这是一个提取<ghf>
值的简单示例。这将有效:
<flow name="Flotttt" doc:name="Flow1WithoutUsingNameSpaceManager">
<file:inbound-endpoint responseTimeout="10000" connector-ref="File_Input" doc:name="File" path="E:\backup\test">
<file:filename-regex-filter pattern="aa.xml" caseSensitive="false" />
</file:inbound-endpoint>
<logger message="Trying to process : #[xpath://.[xpath:local-name()='abc']/*[xpath:local-name()='cde']/*[xpath:local-name()='ghf']]" level="INFO" doc:name="Logger" />
<choice doc:name="Choice">
<when expression="#[xpath://.[xpath:local-name()='abc']/*[xpath:local-name()='cde']/*[xpath:local-name()='ghf'] ='ghf123']">
<processor-chain doc:name="Processor Chain">
<logger message="[WithoutUsingNameSpaceManager] MATCH" level="INFO" doc:name="Logger" />
</processor-chain>
</when>
<otherwise>
<processor-chain doc:name="Processor Chain">
<logger message="NO MATCH" level="INFO" doc:name="Logger" />
</processor-chain>
</otherwise>
</choice>
</flow>
您将在记录器中获得<ghf>
的值...您可以使用此方法记录'cde'元素的所有子节点。
答案 2 :(得分:0)
如果你想使用XPATH完全使用元素,那么请使用以下
<logger level="INFO" message=" approach1: #[xpath('//abd/cde')]"/>
这会给你
<cde>
<ghf>ghf123</ghf>
</cde>
注意:上面的MEL将把元素作为org.dom4j.tree.DefaultElement对象。如果需要,您可以尝试使用JAXB将其转换为对象。
如果您要查找所有子元素,请尝试以下XPATH。
#[xpath('//abd/cde/*')]"
注意:这将为您提供org.dom4j.tree.DefaultElement对象数组的输出,每个对象用于一个直接子元素。
希望这有帮助。