Home of: [工房 "藤車"] > [SourceForge.net における SASAX]

単純要素

本節では、 テキストを持つ単純要素の解析例を用いて、 SASAX による XML 文書の解析方法を説明します。

文書構造の定義

XML Schema によるスキーマおよび文書例を "文書構造" に示します。.

XML Schema によるスキーマ:

<xs:schema 
  targetNamespace="http://www.lares.dti.ne.jp/~foozy/"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:local="http://www.lares.dti.ne.jp/~foozy/">

  <xs:simpleType name="int">
    <xs:restriction base="xs:integer"/>
  </xs:simpleType>

  <xs:element name="int" type="local:int"/>
</xs:schema>

例:

<foozy:int
 xmlns:foozy="http://www.lares.dti.ne.jp/~foozy/">
    12345678
</foozy:int>

文書構造

対象文書が以下の特徴を持つことがわかります。

要素オブジェクト(群)の生成

前述の文書を解析するためのオブジェクト群は、 "要素オブジェクト(群)の生成" に示すようにして生成されます。


String uri = "http://www.lares.dti.ne.jp/~foozy/";

IntElement intElement =
new IntElement(null, uri, "int");

要素オブジェクト(群)の生成

コンストラクタに対する "null" 引数は、 "intElement" が親要素を持たないルート要素である、ということを意味します。

ValueElement クラス (ないし NumberElement クラス) の派生クラスを用いることで、 他のデータ型を解析することが出来ます。 詳細は API ドキュメントを参照してください。

文書の解析

"Element" 実装クラスを用いて XML 文書を解析するためには、 以下に示すように、 "ElementDrivenHandler" を用いて (JAXP の)SAXParser に対して適合させる必要があります。


ElementDrivenHandler handler =
new ElementDrivenHandler(intElement);

// java.io.Reader である "reader" から
// XML 文書を読み込みたい場合:
handler.parse(reader);

// java.lang.String である "document" から
// XML 文書を読み込みたい場合:
handler.parse(document);

文書の解析

ElementDrivenHandler#parse メソッドはその内部で、 SAXParserFactory から SAXParser を取得し、 自分自身を指定して SAXParser#parse を起動します。 これにより、 Element で定義されたメソッドが、 対応する SAX イベントに応じて起動されます。

備考: 本チュートリアルでは、 説明単純化のためにメモリ/性能効率は無視しています。 効率的な使用方法に関しては API ドキュメントを参照してください。

ElementDrivenHandler#parse 起動後、 IntElement クラスの getInteger メソッドを "intElement" に対して起動することで、 整数値を得ることが出来ます。 getInteger メソッドの引数に関する詳細は、 "Custom element" ないし API ドキュメントを参照してください。

チュートリアル本節におけるコードの完全なものは、 配布物の src/demo/sasax/src 配下にある jp.ne.dti.lares.foozy.sasax.SimpleDemo です。 このクラスはバイナリ配布版中の demo.jar に含まれています。


次節「複合要素」へ

詳細情報

クラス図

本節におけるクラス図を以下に示します。

クラス図
クラス図 (クリックで拡大表示)

オブジェクト図

本節におけるオブジェクト図を以下に示します。

オブジェクト図
オブジェクト図 (クリックで拡大表示)

シーケンス図

SAXParser、ElementDrivenHandler および Element 実装クラスにおける処理フローは以下のようになります。

  1. SAXParser が、ElementDrivenHandler の "startElement" を起動
  2. ElementDrivenHandler が、現状保持している Element の "startElement" を起動
  3. Element(現状は IntElement) が、次のイベント受領者として自身を返却
  4. ElementDrivenHandler は、"intElement" を次のイベント受領者として保持
  5. .....
  6. SAXParser が、ElementDrivenHandler の "endElement" を起動
  7. ElementDrivenHandler が、現状保持している Element の "startElement" を起動
  8. Element(現状は IntElement) が、次のイベント受領者として null を返却
  9. ElementDrivenHandler は、"null" を次のイベント受領者として保持

加えてシーケンス図を以下に示します。

シーケンス図
シーケンス図 (クリックで拡大表示)

クラス名

本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。

表記完全名
Element jp.ne.dti.lares.foozy.sasax.Element
ElementDrivenHandler jp.ne.dti.lares.foozy.sasax.ElementDrivenHandler
IntElement jp.ne.dti.lares.foozy.sasax.IntElement
NumberElement jp.ne.dti.lares.foozy.sasax.NumberElement
ValueElement jp.ne.dti.lares.foozy.sasax.ValueElement