倭マン's BLOG

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

2. XML イベントの簡略版オブジェクト・モデル

今回は 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 を見ていきます。