【发布时间】: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 上找到它。
-
您意识到
<tag>badline></tag>实际上是格式良好的 XML,对吗? -
@mirod: ...事实上,如果你想检测这样的错别字,那么不使用真正的 XML 解析器是一个很好的理由。通常,您确实希望首先正确解析 XML,但在这种情况下,在解析标记后很难区分
<tag>badline></tag>(可能是错字)和<tag>badline&gt;</tag>(可能是故意的)。跨度> -
很久以后... @IlmariKaronen:我不会把它称为错字,就 XML 解析器而言,这两种形式几乎相同,它们都解析并且它们都被解释为相同方式,即解析器在这两种情况下都会返回文本
baseline>