2011-03-07 118 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