当我解析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
感谢Spaceghost,但格式良好的错误已由解析器用位置信息进行诊断。我应该更加精确:例如,我想指出,无效的属性名称,无效值,换句话说,数据的语义错误,而不是语法。 JJ – Jens 2011-03-07 18:55:50
我解释了页面..他们还包括验证错误作为例外来源。 – Spaceghost 2011-03-07 19:20:26
验证只能做非常有限的检查,我需要做更多。想想一个数字属性值必须是一个素数。我想“打印”第200行:属性n = '42'不是素数“。我确定当调用start_element时,解析器状态在某处包含行/列/偏移量。但是,我如何访问它? – Jens 2011-03-07 19:49:46