用于从XML中提取XML的对象/部分的Xpath表达式

时间:2014-08-14 08:04:12

标签: xml xpath mule

我试图通过提取有效负载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元素的所有内容都是必需的。

3 个答案:

答案 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对象数组的输出,每个对象用于一个直接子元素。

希望这有帮助。