【问题标题】:using a regex to search an xml file using Perl使用正则表达式使用 Perl 搜索 xml 文件
【发布时间】:2013-10-11 01:42:47
【问题描述】:

我正在尝试在 perl 中创建一个简单的脚本,该脚本将在 xml 文件中查找明显的错误。我认为实现这一点的最佳方法是创建一个正则表达式并让 perl 使用它来返回错误的 xml 行。这是我的代码

#!/usr/bin/perl
$file = '/path/to/my/xml/file.txt';
open(txt, $file);
while($line = <txt>) {
  print "$line" if $line =~ m/<[a-zA-Z]*>[$a-zA-Z0-9]*>[a-zA-Z0-9]*</;
}
 close(txt);

我正在使用的正则表达式在 notepad++ 中完美运行,但是当我将它放入 perl 时它不想工作。我试图找到一行看起来像这样的xml

<tag>badline></tag>

如果我拆分我的正则表达式行会返回。

m/<[a-zA-Z]*> -works
[$a-zA-Z0-9]*> -works
[a-zA-Z0-9]*</; -works

但是当我像我在代码中显示的那样组合它们时,它不会

非常感谢任何帮助,谢谢。

【问题讨论】:

  • 这是处理 XML 的一种非常糟糕的方式。为什么不使用 CPAN 的众多 XML 解析器之一来检查错误?
  • 欢迎来到 SO。这个问题似乎每天都会出现一次,因此在发布之前进行搜索是合适的。简单的答案是,正则表达式正是用于处理 XML 的错误工具。请参阅this answer 使用真正的 XML 解析器,您可以在 CPAN 上找到它。
  • 您意识到&lt;tag&gt;badline&gt;&lt;/tag&gt; 实际上是格式良好的 XML,对吗?
  • @mirod: ...事实上,如果你想检测这样的错别字,那么使用真正的 XML 解析器是一个很好的理由。通常,您确实希望首先正确解析 XML,但在这种情况下,在解析标记后很难区分 &lt;tag&gt;badline&gt;&lt;/tag&gt;(可能是错字)和 &lt;tag&gt;badline&amp;gt;&lt;/tag&gt;(可能是故意的)。跨度>
  • 很久以后... @IlmariKaronen:我不会把它称为错字,就 XML 解析器而言,这两种形式几乎相同,它们都解析并且它们都被解释为相同方式,即解析器在这两种情况下都会返回文本baseline&gt;

标签: xml regex perl


【解决方案1】:

必须总是use strictuse warnings每个 Perl程序的顶部,无论多么微不足道,并使用my声明所有变量他们的第一个使用点。这会警告您 Perl 试图在正则表达式中插入变量 $a,该正则表达式未定义,因此计算结果为空字符串。

我不知道您为什么要在字符类中匹配美元字符,但您需要在 Perl 正则表达式中对其进行转义,例如 [\$a-zA-Z0-9]

不过,总而言之,除非您有特定的格式问题,否则我认为将 XML 放入 XML 解析器或编辑器会更好。这样一来,任何错误都会被立即指出,而无需您检查具体问题。

【讨论】:

  • 圣牛做到了。太感谢了。我会使用更传统的解析器,但它是为了工作,他们想要一个特定环境上的脚本,这样任何人都可以运行脚本来验证开发人员给我们的内容。所以我认为编写一个简单的 Perl 脚本是可行的方法,因为它内置了正则表达式。如果你有关于我应该如何去做的建议,我会全力以赴。再次感谢。
  • 如果您的 XML 有一个 DTD 或描述它的模式,那么您需要使用它。
【解决方案2】:

我觉得文件句柄最好用大写,使用后记得关闭文件句柄。

#!/usr/bin/perl -w //try to always use warning;
use strict; //try to open strict.
open(TXT,"/path/to/my/xml/file.txt") or die "Cannot open the file $!"; 
while(<TXT>)
{
    if(/<.*>(.*)?<.*>/) // I am not sure whether you have other formats but this one works well with the format your provided. 
    {
            print $_;
    }
 }
 close TXT;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多