倭マン's BLOG

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

続・StAX での XML イベント

前回に引き続き、今回も 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() メソッドで型チェックをできます。