【问题标题】:How can I get the value of the specific value in the xml file?如何获取 xml 文件中特定值的值?
【发布时间】:2019-05-20 22:29:18
【问题描述】:

即使使用 local-name() 检索 xml 值,我仍然没有得到任何结果。

我正在使用 NiFi (apache 1.9.2) 并且我认为可能是命名空间的问题。我收到的 XML 文件如下所示:

<RCV_MSG xmlns="data" dateread="2019/02/13">
  <METADATA>
    <TEXT Name="filename">C:\transmit\241</TEXT>
    <TEXT Name="code">8EAFB40</TEXT>
  </METADATA>
</RCV_MSG>

我正在尝试使用 EvaluateXPath 处理器将值 8EAFB40 发送到流文件。

处理器中字段的内容:

Destination: flowfile-content
Return Type: string
Validate DTD: false
extract (the manditory added) : //*[local-name()-'METADATA']

我知道最后一个字段“提取”是问题...返回两个 TEXT 值,即:

C:\transmit\241
8EAFB40

我尝试了很多不同的方法来获得只是第二行,但到目前为止都没有结果(我得到的结果是空的)。顺便说一句,这是从真正的问题集中减少的......我不能只抓住第二行并完成它。我真的需要提取 XML。

【问题讨论】:

  • 你能试试这个 xpath 表达式吗? *//TEXT[2]
  • 我已经试过了...... :(但我不能肯定它永远是第二个。

标签: xml xslt xpath apache-nifi


【解决方案1】:

因为你不想处理命名空间,你可以使用这个 XPath:

//*[local-name() = 'METADATA']/*[@Name = 'code']

或者为了更精确,你可以使用namespace-uri()函数,例如:

//*[local-name() = 'METADATA' and namespace-uri() = 'data']/*[@Name = 'code']

【讨论】:

  • 如果我 不得不 处理命名空间(例如,如果 XML 中有多个命名空间),是否也可以选择命名空间?这超出了我的需要,但我已经完成了必须处理 XML 中不同名称空间的 Java。我认为我需要的是 XPath 表达式的一个很好的参考。但再次,谢谢你
  • @BrianWithnell,你可以使用namespace-uri()函数,例如://*[local-name() = 'METADATA' and namespace-uri() = 'data']/*[@Name = 'code']
  • @Krill Polishchuk,再次感谢。这使它具有竞争力(至少对于我正在做的事情)。
【解决方案2】:

好的,再细化一点...如果您必须确保它与示例中的路径完全相同:

/*[local-name()='RCV_MSG']/*[local-name()='METADATA']/*[local-name()='TEXT' and @Name='code']

更明确...但仍然没有指定命名空间。

【讨论】:

    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多