如何使用perl的XML :: SAX获取XML文件的行/列

时间:2011-03-07 18:39:13

标签: xml perl sax

当我解析XML并发现问题时,我想告诉问题在哪里,即至少打印一个行号。这是一个完整的小例子:

use XML::SAX;
my $gFactory = XML::SAX::ParserFactory->new ();
my $gParser = $gFactory->parser (Handler => EventHandler->new ());
$gParser->parse_uri ("foo.xml");
exit 0;

package EventHandler;
use base 'XML::SAX::Base';

sub start_element {
  my ($aSelf, $aElement) = @_;
  my ($name, $attributes) = ($aElement->{Name}, $aElement->{Attributes});
  print "at line/column/byte ...\n";
}

我会在print语句中使用什么? 我搜索了'net并找到了XML :: SAX :: DocumentLocator,但我不确定这是否是我正在寻找的,如果是的话,如何使用它。正确方向的任何温和的刺激深深地受到赞赏!

PS:看来在引擎盖下使用的解析器是libxml。

JJ

2 个答案:

答案 0 :(得分:1)

从这个页面(http://perl-xml.sourceforge.net/perl-sax/sax-2.1-ref.html)看起来很简单.. 在例外情况下,它说:

  

如果因异常而引发异常   解析错误,这些属性是   也有:

ColumnNumber  The column number of the end of the text where the
     发生了异常。       LineNumber异常所在文本末尾的行号   发生了。       PublicId异常所在实体的公共标识符   发生了。       SystemId实例所在的系统标识符   发生。

如果发生解析异常或验证错误,您似乎可以获得行号和列号 正如我在页面上所说的那样:“当出现格式良好或验证错误时,需要符合条件的XML解析器来中止处理。”

验证将包括属性名称,不是吗?

答案 1 :(得分:1)

我转而使用XML::Parser::PerlSax。这个模块有一个方法location()来返回一个散列,其中包含文件,行,列位置。 见https://metacpan.org/pod/XML::Parser::PerlSAX