今回は XML イベントの簡略版オブジェクト・モデルを考えます。
javax.xml.stream.events パッケージに定義されている XMLEvent 群を使ってもいいんですが、あんまりイベントの種類があっても面倒なので、この記事では「要素」と「テキスト」だけしかない XML 文書のみを考えましょう。 DTD や実体参照は勿論、属性や名前空間宣言も考えません。
XML イベントとして考えるのは次の5つです:
- 文書の開始と終了:StartDocument, EndDocument
- 要素の開始と終了:StartElement, EndElement
- テキスト:Text
これらは全て XMLEvent インターフェースを実装するようにしましょう。
XML イベント
まずは全ての XML イベントが実装するインターフェース「XMLEvent」です:
package xmlparsing.events; public interface XMLEvent { int START_DOCUMENT = 0; int END_DOCUMENT = 1; int START_ELEMENT = 2 int END_ELEMENT = 3; int TEXT = 4; int getEventType(); }
イベントの種類を列挙する int 定数と、各インスタンスに対してそれを取得するメソッド getEventType() を定義してあります。
文書
具体的な XML イベント、最初は文書の開始と終了のイベント StartDocument, EndDocument です。 これらには getEventType() メソッドの実装のみを定義してあります:
package xmlparsing.events; public class StartDocument implements XMLEvent { public int getEventType() { return START_DOCUMENT; } @Override public String toString(){ return "<?xml version=\"1.0\"?>"; } }
package xmlparsing.events; public class EndDocument implements XMLEvent{ public int getEventType() { return END_DOCUMENT; } @Override public String toString(){ return "<!-- EOF -->"; } }
要素
次のイベントは 要素の開始と終了のイベント StartElement, EndElement です。 これらには getEventType() メソッドの実装に加えて、要素名を取得するメソッド getName() が定義されています(他に private フィールドやコンストラクタも):
package xmlparsing.events; public class StartElement implements XMLEvent{ private final String name; public StartElement(String name){ this.name = name; } public String getName(){ return this.name; } public int getEventType() { return START_ELEMENT; } @Override public String toString(){ return "<"+getName()+">"; } }
package xmlparsing.events; public class EndElement implements XMLEvent { private final String name; public EndElement(String name){ this.name = name; } public String getName(){ return this.name; } public int getEventType() { return END_ELEMENT; } @Override public String toString(){ return "</"+getName()+">"; } }
Text
最後はテキストのイベント Text です。 これには getEventType() メソッドの実装と、内容の文字列を取得するメソッド getText() 等を定義しています:
package xmlparsing.events; public class Text implements XMLEvent{ private final String data; public Text(String data){ this.data = data; } public String getText(){ return this.data; } public int getEventType() { return TEXT; } @Override public String toString(){ return getText(); } }
次回は、これらを用いて「プル・パース」のための API を見ていきます。