倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

XML 文書内の位置を取得するインターフェース

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 のような、オブジェクトモデルによらない位置指定を使えるようにしてみてはどうでしょう? 実装は結構面倒かも知れませんけど。