2011-03-07 117 views
1

当我解析XML并发现问题时,我想告诉问题出在哪里,即至少打印行号。这里有一个完整的小例子:如何使用perl的XML获取XML文件的行/列:SAX

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"; 
} 

我会在打印语句中使用什么? 我搜索了'net并找到了XML :: SAX :: DocumentLocator,但我不确定这是我正在寻找的内容,如果是的话,如何使用它。在正确的方向任何温柔的刺激深深感激!

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

JJ

回答

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解析器需要在出现格式错误或验证错误时中止处理。”

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

+0

感谢Spaceghost,但格式良好的错误已由解析器用位置信息进行诊断。我应该更加精确:例如,我想指出,无效的属性名称,无效值,换句话说,数据的语义错误,而不是语法。 JJ – Jens 2011-03-07 18:55:50

+0

我解释了页面..他们还包括验证错误作为例外来源。 – Spaceghost 2011-03-07 19:20:26

+0

验证只能做非常有限的检查,我需要做更多。想想一个数字属性值必须是一个素数。我想“打印”第200行:属性n = '42'不是素数“。我确定当调用start_element时,解析器状态在某处包含行/列/偏移量。但是,我如何访问它? – Jens 2011-03-07 19:49:46