0

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

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

例子

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

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

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

我尝试使用另一个名为“Ultraedit”的软件,但我猜它的语法不同,因为我可以使用正则表达式但需要选择其中一个选项:Perl、Unix、Ultraedit;只使用“Perl”我可以做这个替换,但也有,对于大文件,这不起作用,我得到以下错误:

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

谁能帮我解决这个问题?不幸的是,我什至对正则表达式都不是很好,我不确定上面的代码是好是坏..

4

3 回答 3

0

尝试这个:

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

什么都换。

当正则表达式运行时,这可能是灾难性回溯的情况,因为太多量词应用于太多宽字符类,例如.

此答案中的量词仅适用于不应通过 XML 标记停止表达式回溯的类<>

于 2018-10-08T08:17:57.517 回答
0

您为这项工作使用了错误的工具。如果您要操作 XML,那么您需要将 XSLT 和/或 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>
于 2018-10-08T15:25:28.773 回答
-1

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

<[^<]+value=""[^>]*>
于 2018-10-08T08:10:21.427 回答