UltraEdit/Notepad - XML 移除属性为空的节点

UltraEdit/Notepad - XML Remove nodes with empty properties

我目前正在使用的软件遇到问题,该软件从外部软件接收到我们确实需要处理的几个 Xml,现在我们的问题是那些 Xml 文件包含许多完全无用的节点,并且因此使文件 (xmls) 非常重,结果程序运行速度非常慢以处理每个 xml s,这应该在将来改变,我想证明通过删除这些节点我们会大大缩短处理时间,现在我想作为第一步手动执行此操作,使用示例 xml 并应用正则表达式语法删除所有值为 属性 空的节点,这是我现在使用的语法,通过记事本中的替换功能,我能够删除这些行,然后删除空的行:

<.*(\s\w+?[^=]*?="[^"]*?")*?\s+?value="[""]*?".*?>

例子

<TEST_NODE value="1"/>
<TEST_NODE value=""/>
<TEST_NODE value="0"/>

在我的例子中,节点可以以不同的方式命名并且可以具有不同的属性,但我应该关心的是那些在值 属性 中包含某些内容的节点,因此在这种情况下我应该删除第二行

这看起来工作正常,但是对于非常大的文件 (10 mb),replace notepad++ 功能似乎有问题并且它停止正常工作破坏了很多标签...

我试过使用另一种名为 "Ultraedit" 的软件,但我猜它的语法有所不同,因为我可以使用正则表达式但需要 select 这些选项之一:Perl、Unix、超编辑;仅使用 "Perl" 我能够进行此替换,但也在那里,对于大文件,这不起作用,我收到以下错误:

匹配表达式的复杂性已超出可用资源..

谁能帮我解决这个问题?不幸的是,我什至不太擅长使用 Regex,我不确定上面的代码是好是坏..

在 Notepad++ 中试试这个正则表达式

<[^<]+value=""[^>]*>

试试这个:

<(?=[^><]*?value\s*=\s*"")[^><]*>

什么都不替换。

这可能是灾难性回溯的一个例子,当正则表达式运行时由于太多量词应用于太多宽字符 class 像 .

这个答案中的量词只适用于 not <> class 应该停止表达式通过 XML 标签回溯。

您为这项工作使用了错误的工具。如果您要操作 XML,那么您需要将 XSLT and/or XQuery 添加到您的工具包中。在作业中使用正则表达式速度慢且容易出错。

例如,这里只是您接受的答案中的一些错误:

  • 不会匹配使用单引号 (value='') 的元素
  • 不会匹配等号周围有空格的元素
  • 具有名称以 value 结尾的属性的元素(例如 xvalue="")将被匹配
  • value="" 将在注释和 CDATA 节点内匹配
  • value="" 可以在文本节点内匹配:<x>value=""</x>
  • 跨多行拆分的元素将不匹配(我怀疑)

在 XSLT 3.0 中,这很简单

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:mode on-no-match="shallow-copy"/>
 <xsl:template match="*[@value='']"/>
</xsl:transform>