【问题标题】:Xpath expression to extract an object/part of XML from an XML用于从 XML 中提取对象/部分 XML 的 Xpath 表达式
【发布时间】:2014-08-15 03:22:46
【问题描述】:

我正在尝试通过提取有效负载 XML 的一部分来设置变量。但是这个 xpath 表达式只适用于简单的子节点,但不适用于有子节点的元素。

预期:需要记录以下请求 XML 的“cde”元素的所有子节点。 两种方法都不起作用。

<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 evaluator 可以和它一起使用吗?

编辑: 预期:cde 元素的所有内容都是必需的。

【问题讨论】:

  • 乌龟,我看到你正在使用“文本”属性。你有访问 innerXML 的权限吗?

标签: xml xpath mule


【解决方案1】:

我不熟悉Mule,但是XPath表达式为

'cde' 元素的所有子节点

是,如果“所有子节点”是指所有 element 子节点:

"//cde/*"

否则,如果您真的指的是任何类型的节点:

"//cde/node()"

【讨论】:

    【解决方案2】:

    我认为提取价值没有问题。

    您可以使用#[xpath://.[xpath:local-name()='abc']/*[xpath:local-name()='cde']/*[xpath:local-name()='ghf']] 来提取ghf 的值。

    这是一个提取&lt;ghf&gt; 值的简单示例。这将起作用:

    <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>
    

    您将在记录器中获得&lt;ghf&gt; 的值...您可以使用此方法记录'cde' 元素的所有子节点

    【讨论】:

    • 我需要整个 cde 元素而不仅仅是 ghf 的值
    • 这里 'ghf123' 必须被捕获,而不仅仅是 ghf 中的值。
    • 'ghf123' 是什么意思?您想在 Logger 中捕获整个结构吗?
    • 是的...整个结构无论在 cde 元素内
    • 这些 XPATH 表达式对于 Mule 已过时,请改用 MEL。
    【解决方案3】:

    如果您想完全使用 XPATH 获取元素,请使用以下方法

    <logger level="INFO" message=" approach1: #[xpath('//abd/cde')]"/>
    

    这会给你

    <cde>
       <ghf>ghf123</ghf>
     </cde>
    

    注意:上面的 MEL 会将元素作为 org.dom4j.tree.DefaultElement 对象。如果需要,您可以尝试使用 JAXB 将其转换为对象。

    如果你正在寻找所有的子元素,那么 cde 试试下面的 XPATH。

    #[xpath('//abd/cde/*')]"
    

    注意:这将为您提供一个 org.dom4j.tree.DefaultElement 对象数组的输出,每个对象对应一个直接子元素。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-02-02
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多