當我解析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