NiFi ReplaceText:在特定标签之间剥离所有xml标签

时间:2019-03-08 18:13:02

标签: regex xml apache-nifi

我下面有XML文档。我想剥离State<TXT>之间的所有标签,以在NiFi中制作原始文本标签,以便原始文本读起来像一个句子。我在NiFi的ReplaceText处理器中尝试了以下正则表达式模式,但是该过程失败了,即使它捕获了regex101.com上的完整txt部分。我做错了什么?

客户宁愿使用内置的NiFi处理器来执行此操作,而不是执行脚本。

正则表达式

</TXT>

XML

<TXT.*>((.|\n)*?)<\/TXT>$

ReplaceText配置如下

<DOC>
<ID>12345</ID>
<TXT>
    <A><DESC type="PERSON">George Washington</DESC> lived in a house called <DESC type="PLACE">Mount Vernon</DESC></A>
</TXT>
</DOC>

理想的输出

Search Value: <TXT.*>((.|\n)*?)<\/TXT>$
Replacement Value: <RAW>$1</RAW>
Character Set: UTF-8
Maximum Buffer Size: 1 MB
Replacement Strategy: Regex Replace
Evaluation Mode: Entire text

1 个答案:

答案 0 :(得分:0)

首先,免责声明:

  • XSLT转换可能就是您想要的
  • 脚本可能就是您想要的

据我所知,您无法在NiFi中进行递归正则表达式。因此,您需要链接处理器:

  • 一个处理器将<TXT>([\S\s]*?)<\/TXT>替换为<RAW>$1</RAW>
  • 一个处理器可以路由<RAW>[\S|\s]*?<[\S|\s]*?</RAW>上的内容(如果RAW包含内部标记)
    • 如果没有对手,那就很好
    • 如果匹配,请使用另一个replaceText (<RAW>[\S\s]*?)(<[\S\s]*?>)([\S\s]*?</RAW>)
    • 删除第一个标签

但是,这确实显得有些矫kill过正,并且由于注释了您的文本,因此您的客户端可能已经在某处使用了Python,因此不必担心脚本。