SAX API, DOM API, javax.xml.** パッケージ内には、XML 文書を読み込む際に読み込み位置を取得するためのインターフェースが幾つか定義されています。 今回は、それらを簡単に整理しておきます。
位置を指定するインターフェース
読み込み位置を取得するためのインターフェースをピックアップすると、以下のようなものが見つかりました:
- org.xml.sax.Locator
- org.xml.sax.ext.Locator2
- org.w3c.dom.DOMLocator
- javax.xml.stream.Location
- javax.xml.transform.SourceLocator
- javax.xml.transform.dom.DOMLocator
他にも javax.xml.bind.ValidationEventLocator というインターフェースがありましたが、javax.xml.bind パッケージはよく知らないので、今回は省略。
共通のメソッド
上記のインターフェースに共通に定義されているメソッドには次のものがあります:
メソッド名 | 返り値 | 説明 |
---|---|---|
getPublicId() | String | 読み込んでいる XML 文書の公開識別子(パブリック ID)を返します。 |
getSystemId() | String | 読み込んでいる XML 文書のシステム識別子(システム ID)を返します。 |
getLineNumber() | int | 現在の行番号を返します。 取得できない場合は-1を返します。 |
getColumnNumber() | int | 現在の列番号を返します。 取得できない場合は-1を返します。 |
ただし、org.w3c.dom.DOMLocator には getPublicId(), getSystemId() は定義されておらず、代わりに getUri()(返り値は String)が定義されています。
各インターフェース固有のメソッド
インターフェースによっては、共通のメソッドの他に、いくつかのメソッドが定義されているものがあります。 それらをまとめると下表のようになります:
インターフェース | その他メソッド |
---|---|
org.xml.sax.Locator | |
org.xml.sax.ext.Locator2 | getEncoding() : String getXMLVersion() : String |
org.w3c.dom.DOMLocator | getByteOffset() : int getUtf16Offset() : int getRelatedNode() : org.w3c.dom.Node |
javax.xml.stream.Location | getCharacterOffset() : int |
javax.xml.transform.SourceLocator | |
javax.xml.transform.dom.DOMLocator | getOriginatingNode() : org.w3c.dom.Node |
各メソッドの役割は、ここでは省略。 API ドキュメントを見てください。
チョット思うこと
共通に定義されているメソッドのうち、getPublicId(), getSystemId() はいいんですが、getLineNumber(), getColumnNumber() は読み込み対象の XML 文書がファイルやストリームだということが前提になってる感じがしてチョット違和感。 取得不可能なら-1を返す仕様なので、別に問題ないんですけど。
XPath や XPointer のような、オブジェクトモデルによらない位置指定を使えるようにしてみてはどうでしょう? 実装は結構面倒かも知れませんけど。