SAXで現在解析中の行番号を得る
Locatorから取得できます。
- XMLFilterImpl#setDocumentLocator()をオーバーライドしておくとLocatorが渡されてくるので、
- 必要なタイミンクでLocator#getLinenumber()を呼び出して、行番号を取得すればOK
以下は、各要素の行番号とカラム番号を出力するサンプルです。
public static void main ( String[] args ) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(true); XMLReader reader = factory.newSAXParser().getXMLReader(); InputStream in = null; try { in = ClassLoader.getSystemClassLoader().getResourceAsStream( "sax/foo.xml" ); new SmapleFilter(reader).parse( new InputSource( in ) ); } finally { if ( in != null ) in.close(); } } // Locationから行番号を取得するサンプルフィルタ static class SmapleFilter extends XMLFilterImpl { private Locator locator; SmapleFilter( XMLReader parent ) { super(parent); } /** * オーバーライドしておくと、Locatorが設定される。 */ @Override public void setDocumentLocator(Locator locator) { this.locator = locator; } @Override public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { // Locatorから現在の行番号、カラム番号?が取得できる。 System.out.println( localName + " : " + locator.getLineNumber() + ", " + locator.getColumnNumber() ); super.startElement(uri, localName, qName, attrs); } }
↓のXMLを解析させると、
<?xml version="1.0" encoding="UTF-8" standalone='yes'?> <foo> <var/> <var> <hoge/> </var> </foo>
以下の結果が出力されます。
foo : 2, 6 var : 3, 9 var : 4, 8 hoge : 5, 12