前回に引き続き、今回も XML イベント。 今回は、javax.xml.stream.events.XMLEvent インターフェースに定義されているメソッドと、XML イベントの種類を見ていきます。
XMLEvent インターフェースに定義されているメソッド
XMLEvent インターフェースに定義されているメソッドを見ていきましょう。 ただし、getLocation(), getSchemaType(), writeAsEncodedUnicode(java.io.Writer) は省略します。
型チェックメソッド getEventType(), isXxxx()
getEventType() メソッドは、その XML イベントの型に対応した int 値を返します。 この int 値は javax.xml.stream.XMLStreamConstants に定義されている定数です。 このメソッドによって、XML イベントの種類を判別することができます。
また、isXxxx() メソッドによっても XML イベントの種類を判別することができます。 例えば XMLEvent が StartElement イベントかどうかを判別するには、XMLEvent.isStartElement() メソッドが真を返すかどうかによって判断できます。
キャストメソッド asStartElement(), asEndElement(), asCharacters()
各 XML イベント固有の処理をしたい場合は、XMLEvent のサブタイプにダウンキャストする必要があります。 このダウンキャストがよく必要になる XML イベント StartElement, EndElement, Characters に対しては、これを行うメソッドが定義されています。
Object#toString() メソッド
XMLEvent オブジェクトに対して toString() メソッドを呼び出すと、そのイベントを通知した XML 文書の断片が返されるようです。 したがって、ある XML 文書を解析して発生した一連の XML イベント列に対して toString() メソッドで返される文字列を連結していくと、元の XML 文書が復元できます。 ただし、これは StAX の仕様ではなく、したがって StAX の実装ごとに処理が異なるかも知れません。
XML イベントの種類
XML イベントの種類に対して、その実装や XMLEvent に定義されている型チェックメソッドなど表にまとめました:
XML イベント | XMLEvent のサブタイプ*1 | XMLEvent に定義されている型チェックメソッド | XMLStreamConstants に定義されている定数 |
---|---|---|---|
文書の開始 | StartDocument クラス | isStartDocument() | START_DOCUMENT |
文書の終了 | EndDocument クラス | isEndDocument() | END_DOCUMENT |
要素の開始 | StartElement クラス | isStartElement() | START_ELEMENT |
要素の終了 | EndElement クラス | isEndElement() | END_ELEMENT |
属性 | Attribute クラス | isAttribute() | ATTRIBUTE |
名前空間宣言 | Namespace クラス | isNamespace() | NAMESPACE |
文字列 | Characters クラス | isCharacters() | CHARACTERS |
無視できる空白*2 | Characters クラス | -*3 | SPACE |
CDATA セクション*4 | Characters クラス | -*5 | CDATA |
コメント | Comment クラス | - | COMMENT |
処理命令 | ProcessingInstruction クラス | isProcessingInstruction() | PROCESSING_INSTRUCTION |
実体参照 | EntityReference クラス | isEntityReference() | ENTITY_REFERENCE |
実体宣言 | EntityDeclaration クラス | - | ENTITY_DECLARATION |
文書型宣言 | DTD クラス | - | DTD |
記法宣言 | NotationDeclaration クラス | - | NOTATION_DECLARATION |
*1:これらのクラスは javax.xml.stream.events パッケージ内に含まれています。
*2:空白が無視できるかどうかは DTD やスキーマ定義を用いなければ判定できません。
*3:「getEventType() == XMLStreamConstants.SPACE」もしくは javax.xml.stream.events.Characters に定義されている isIgnorableWhiteSpace() メソッドで型チェックをできます。
*4:StAX の実装によっては元の XML 文書が CDATA セクションになっていても文字列として返すものもあります。
*5:「getEventType() == XMLStreamConstants.CDATA」もしくは javax.xml.stream.events.Characters に定義されている isCData() メソッドで型チェックをできます。