読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

SAXで現在解析中の行番号を得る

Java

Locatorから取得できます。

以下は、各要素の行番号とカラム番号を出力するサンプルです。

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