倭マン's BLOG

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

XMLStreamReader をもう少し詳しく (2): hasXxxx() メソッド

今回は hasXxxx() メソッド

hasXxxx() メソッドもオブジェクトの状態を取得するメソッドです。 こちらも boolean 値を返します。 ここで見るメソッドは

  • hasName()
  • hasText()

です。 hasNext() メソッドは列挙のためのメソッド(Iterator インターフェースのメソッド)なのでここでは割愛。

hasName() メソッド


hasName() メソッドは、現在の XML イベントが名前(ここでは QName のこと)を持っていれば true を、そうでないなら false を返します。 具体的には、

  • 要素の開始 (StartElement)
  • 要素の終了 (EndElement)

の場合に true を、それ以外では false を返します。

実装例

    public boolean hasName() {
        switch(getEventType()){
            case START_ELEMENT:
            case END_ELEMENT:
                return true;
            default:
                return false;
        }
        // もしくは
        // return isStartElement() || isEndElement();
    }

hasText() メソッド


hasText() メソッドは、現在の XML イベントがテキストを持っていれば true を、そうでないなら false を返します。 XMLStreamReader の JavaDoc をみると、テキストを持っているイベントは

  • CHARACTERS
  • SPACE
  • COMMENT
  • DTD
  • ENTITY_REFERENCE

となっていて、CDATA がテキストを持っているとなっていないのが謎です。 Sun の JDK の実装では CDATA イベントが返されません(CHARACTERS イベントとして返されます*1)が、他の実装でそうなっているかどうかは分かりません。

実装例

    public boolean hasText() {
        switch(getEventType()){
            case CHARACTERS:
            case SPACE:
            case COMMENT:
            case DTD:
            case ENTITY_REFERENCE:
                return true;
            default:
                return false;
        }
    }

*1:これはプロパティ「javax.xml.stream.isCoalescing」を false に設定しても同じようです。