読者です 読者をやめる 読者になる 読者になる

倭マン's BLOG

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

XMLStreamReader をもう少し詳しく (6): require() メソッド

今回は XMLStreamReader#require() メソッド。 このメソッドは、現在の XML イベントが要求したものと一致するかどうかをチェックし、一致すればそのまま、一致しなければ XMLStreamException を投げます。引数 require() メソッドの定義は以下のようになっ…

XMLStreamReader をもう少し詳しく (5):要素の名前に関するメソッド

今回は要素の名前に関連するメソッドを見ていきます。 具体的には以下の4つのメソッドです: getName() getPrefix() getLocalName() getNamespaceURI() これらは「要素の名前」に関連するメソッドのため、現在の XML イベントが属性 (Attribute) のときに呼…

XMLStreamReader をもう少し詳しく (4): getElementText() メソッド

今回は XMLStreamReader#getElementText() メソッドを見ていきます。getElementText() メソッドは、要素の開始と要素の終了で挟まれたテキストを返します。 これは XML で書かれたプロパティファイルを処理する際に便利です。例えば <book> <title>なぜ宇宙人は地球に来な</title></book>…

XMLStreamReader をもう少し詳しく (3): nextTag() メソッド

今回は XMLStreamReader#nextTag() メソッドの処理を見ていきます。nextTag() メソッドは、次の要素の開始 (START_ELEMENT) または要素の終了 (END_ELEMENT) まで XML 文書の解析を進めます。 解析の際の処理は、現れた XML イベントの種類によって次の4種類…

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

今回は hasXxxx() メソッド。hasXxxx() メソッドもオブジェクトの状態を取得するメソッドです。 こちらも boolean 値を返します。 ここで見るメソッドは hasName() hasText() です。 hasNext() メソッドは列挙のためのメソッド(Iterator インターフェースの…

XMLStreamReader をもう少し詳しく (1): getEventType(), isXxxx() メソッド

今回から何回かにわたって、javax.xml.stream.XMLStreamReader の挙動を見ていきます(一覧)。予定としては getEventType(), isXxxx() メソッド hasXxxx() メソッド nextTag() メソッド getElementText() メソッド 要素の名前に関するメソッド(getName(), …

XSLT スタイルシートのソースとしての org.w3c.dom.Document オブジェクト

「JavaでXSLT変換処理。DOMSourceだと何故かダメ。」という記事で XSLT スタイルシートの Source として DOMSource が使えないというのが載ってました。 jre 1.5 での話とのことなので、1.6 になったら修正されているかと思って試してみましたが、直ってませ…

org.w3c.dom.Document を java.io.Reader に変換する

以前の記事で org.w3c.dom.Document オブジェクトを java.io.Writer へ書き出す処理を見ました。今回はそれを踏まえて、「org.w3c.dom.Document オブジェクトを java.io.Reader オブジェクトとして扱う」方法を考えます。 この目的のために java.io.Reader …

FEATURE フィールド

標準 API に定義されている Source, Result インターフェースの実装には、public static final な String フィールド「FEATURE」が定義されています。 これは TransformerFactory#getFeature() メソッドによって、各タイプの Source, Result をサポートして…

システムリソースからスタイルシートを読み込む (3) : SystemStylesheetLoader

前回のサンプルコードでは、スタイルシートを読み込む手順 (Main クラスの main() メソッド)において、システムリソースの読み込みの基点となる「BASEDIR」変数が2箇所(ステップ2とステップ3)で参照されています。 この整合性は保守をする人にとって無駄…

システムリソースからスタイルシートを読み込む (2)

今回はシステムリソース内のスタイルシートが他のスタイルシートを読み込む(<import>, <include> 要素を持つ)場合を考えます。何の設定もせずに前回と同じ方法をとると、「(読み込まれる方の)スタイルシートが見つからない」旨の例外が投げられます。 これは、読み込み先</include></import>…

システムリソースからスタイルシートを読み込む (1)

Java プログラム内から XSL 変換を実行するには、スタイルシートを読み込む必要があります。 ユーザーが提供するスタイルシートを読み込む場合は通常のファイルを読み込む方法で問題ありませんが、スタイルシート自体を開発者が提供する場合(スタイルシート…

org.w3c.dom.Document を出力する

org.w3c.dom.Document オブジェクトを標準出力やファイルに出力するのに困ったことはありませんか? javax.xml.transform パッケージ内のクラスを使うと、ある程度簡単に Document オブジェクトを外部へ書き出すことが出来ます。java.io.Writer へ書き出す p…

Source, Result と close() 処理

Source, Result インターフェースには、リソースを扱うクラスやインターフェースに通常定義されている「リソース解放」メソッド close()*1 が定義されていないため、これらの処理が自動的に行われていると勝手に思い込んでいましたが、どうもそうではないよ…

Source

今回は javax.xml.transform.Source インターフェースとその実装クラスを見ていきます。Source インターフェース自体にはあまりメソッドは定義されていません。 これは入力となる XML 文書をオブジェクト化して Transformer オブジェクトに渡すためのインタ…

Result

今回は javax.xml.transform.Result インターフェースとその実装クラスを見ていきます。Result インターフェースを実装したクラスには、以下のようなものがあります*1: javax.xml.transform.stream.StreamResult javax.xml.transform.sax.SAXResult javax.x…

TransformerFactory, Transformer

今回から何回かにわたって「javax.xml.transform パッケージ」内のクラスを見ていきます(一覧)。javax.xml.transform パッケージ内には、XSL 変換 (XSLT : XML Stylesheet Language Transformation) を行うための API が定義されています*1。ただしパッケ…

改・NamespaceContext の実装を考える (6) : Dom4jNamespaceContext

以前に org.dom4j.Element クラス用に NamespaceContext のサブクラスを定義して、AspectJ を用いてその取得用のメソッドを織り込むということをやりました(一覧)。 新に作成した AbstractCompositeNamespaceContext クラスを用いて、同様のことをやってお…

改・NamespaceContext の実装を考える (5) : MapNamespaceContext

前回作成した AbstractCompositeNamespaceContext クラスを用いて、ベースとなる NamespaceContext を持ち、Map のように新に名前空間宣言を登録することも出来る MapNamespaceContext クラスを作成しましょう(一覧)。基本方針は、以前の記事で作成した Ma…

改・NamespaceContext の実装を考える (4) : AbstractCompositeNamespaceContext

AbstractCompositeNamespaceContext は、親となる NamespaceContext(例えば親ノードの NamespaceContext)を持ち、それに加えて追加の名前空間宣言があるような場合に使用する NamespaceContext です。 これは以前の記事での AbstractNamespaceContext に対…

改・NamespaceContext の実装を考える (3) : EmptyNamespaceContext

前回作成した AbstractNamespaceContext を用いて、名前空間宣言が全くされていない NamespaceContext を作成しましょう(一覧)。 注意点は、getNamespaceURI(String) メソッドの返り値が常に空文字列 (XMLConstants.NULL_NS_URI) だってことでしょうか? …

改・NamespaceContext の実装を考える (2) : AbstractNamespaceContext

今回は AbstractNamespaceContext の実装を考えます(一覧)。AbstractNamespace は NamespaceContext の JavaDoc で規定された、「特別な引数」に対して「特別な返り値」を返す、という処理を行わせます。getNamespaceURI(String) メソッドの実装 まず、Abs…

改・NamespaceContext の実装を考える (1) : クラス階層

以前 javax.xml.namsepece.NamespaceContext インターフェースの実装クラスを考えてましたが(一覧)、不具合の修正とリファクタリングのため、もう一度 NamespaceContext の実装を考えていきます。 クラス名やメソッド名が少々変わってますが、基本的なアプ…

XMLEventFactory (7) : その他 (2) DTD, EntityReference

今回は DTD と実体参照。 DTD EntityReference 正直あまり使わないので、サラッと流します(というか、サンプルは示しません)。DTD DTD イベントを生成するメソッドは XMLEventFactory#createDTD() です。 createDTD(String dtd) 引数は DTD を表す文字列。…

XMLEventFactory (6) : その他 (1) Comment, ProcessingInstruction

今回はコメントと処理命令に関する XML イベント。 Comment ProcessingInstruction Comment Comment イベントは XMLEventFactory#createComment() メソッドによって生成します。 createComment() メソッドは次の1つのみが定義されています。 createComment(S…

XMLEventFactory (5) : 文字データ Characters, Space, CData, IgnorableSpace

今回は文字データに関する XML イベント。 Characters StartDocument Characters イベントを生成するメソッドは次の4つが定義されています: createCharacters(String data) createSpace(String data) createCData(String data) createIgnorableSpace(String…

XMLEventFactory (4) : 要素 StartElement, EndElement

今回は要素に関する XML イベント。 StartElement EndElement StartElement StartElement イベントは XMLEventFactory#createStartElement() メソッドによって生成します。 createStartElement() メソッドは次の4つが定義されています。 createStartElement(…

XMLEventFactory (3) : 属性・名前空間宣言 Attribute, Namespace

今回は属性と名前空間宣言に関する XML イベント。 Attribute Namespace Attribute Attribute イベントは XMLEventFactory#createAttribute() メソッドによって生成します。 createStartAttribute() メソッドは次の3つが定義されています。 createAttribute(…

XMLEventFactory (2) : 文書 StartDocument, EndDocument

今回は文書に関する XML イベント。 StartDocument EndDocument StartDocument StartDocument イベントは XMLEventFactory#createStartDocument() メソッドによって生成します。 createStartDocument() メソッドは次の4つが定義されています。 createStartDo…

XMLEventFactory (1) : 導入

javax.xml.stream.XMLEventFactory は StAX で使用する XML イベント (javax.xml.stream.events.XMLEvent オブジェクト) を生成するクラスです。 今回から何度かにわたって、このクラスの使用方法を見ていきます。 あまり使うことはないかも知れませんが。XM…

XML 文書のフォーマット 出力編

前回に続き、今回は XML 文書のフォーマットの「出力編」。 SAX, DOM はナシ。 代わりに javax.xml.transform パッケージ (TrAX API) を扱います。各 API での対象となるクラスは以下の表の通り: API version クラス transform Java SE 6 (javax.xml.transf…

XML 文書のフォーマット 入力編

Java で XML 文書を扱う API がいろいろありますが、入出力の際に指定できるフォーマットが各 API でいろいろあるので、チョット整理しておきましょう。 JDOM の Format や dom4j の OutputFormat は次回。今回は読み込みの際に処理を行う「入力編」。 各 AP…

XML 文書内の位置を取得するインターフェース

SAX API, DOM API, javax.xml.** パッケージ内には、XML 文書を読み込む際に読み込み位置を取得するためのインターフェースが幾つか定義されています。 今回は、それらを簡単に整理しておきます。位置を指定するインターフェース 読み込み位置を取得するため…

XMLStreamWriter#writeXxxx() メソッド (3) : 名前空間を使用する場合の要素・属性

今回は名前空間を使用する場合の要素と属性を書き出す XMLStreamWriter#writeXxxx() メソッドを見ていきましょう。定義されているメソッドは、要素の開始、空要素、属性の書き出しメソッドです: void writeStartElement(String uri, String localName); voi…

XMLStreamWriter#writeXxxx() メソッド (2) : 名前空間を使用しない場合の要素・属性

前回に引き続き、今回も XMLStreamWriter インターフェースに定義されている writeXxxx() メソッドを見ていきましょう。 今回見ていくのは名前空間を使用しない場合の「要素」と「属性」です。以下に書かれているサンプルでは、「writer」はXMLStreamWriter …

XMLStreamWriter#writeXxxx() メソッド (1)

今回は XMLStreamWriter インターフェースに定義されている writeXxxx() メソッドを見ていきます(一部次回)。 これらは各種 XML ノードを書き出しますが、大まかに分類すると次のようになります: 文書 writeStartDocument() writeEndDocument() 要素(次…

XMLStreamWriter

XMLStreamWriter は XMLEvent を用いずに XML ノードを外部へ出力するクラスです。 XMLEventWriter の使用手順は以下の通り: XMLStreamWriter のインスタンスを取得する XMLStreamWriter のインスタンスを用いて XML ノードを書き出す XMLStreamWriter をフ…

XMLEventWriter

XMLEventWriter は XMLEvent を外部へ出力するクラスです。 XMLEventWriter の使用方法は以下のような手順で行います: XMLEventWriter のインスタンスを取得する XMLEventWriter のインスタンスを用いて XML イベントを書き出す XMLEventWriter をフラッシ…

続・NamespaceContext の実装を考える

前回までは、DOM や dom4j のようにメモリ上に XML ツリーを展開して扱う API のための NamespaceContext 実装を考えていました(一覧)。今回はそれを利用して、StAX のような API で用いることのできる NamespaceContext 実装を考えてみます。方針 実装方…

XMLInputFactory に設定できるプロパティ

今回は javax.xml.stream.XMLInputFactory に設定できるプロパティを見ていきます。 プロパティの設定を変更することで、XML 文書の解析方法を変えることが出来ます。解析方法の設定を、実際に解析を行う XMLEventReader や XMLStreamReader ではなく、それ…

XMLStreamReader で SAX 解析

XMLEventReader の時と同様、StAX 解析のサンプルとして XMLStreamReader を用いて SAX 解析を行うクラス StaxSAXParser を実装してみましょう。 ここでは、XML イベントとして扱うのは org.xml.sax.ContentHandler が扱うもの*1とします(org.xml.sax.ext.L…

XMLStreamReader

XMLStreamReader も、XMLEventReader 同様 XML 文書を解析するクラスですが、解析中に XML イベントオブジェクトを生成しないため素早く動作します。 XMLSteamReader を用いた XML 文書の解析の手順は、XMLEventReader と(解析処理の実装以外は)ほとんど同…

NamespaceContext の実装を考える (7) : AbstractNamespaceContext の使用例

今回は前回までで考えた AbstractNamespaceContext の実際の使い方を考えてみます(一覧)。ここでは dom4j に定義されている、XML ツリーの要素を表すインターフェース org.dom4j.Element から、NamespaceContext を取得できるようにしてみましょう*1。ただ…

NamespaceContext の実装を考える (6) : AbstractNamespaceContext

前回までで考えた、javax.xml.namespace.NamespaceContext の実装をサポートする抽象クラスは、結局、次のようになります(一覧): import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import…

NamespaceContext の実装を考える (5) : 引数が空文字列のときの挙動

前回までで javax.xml.namespace.NamespaceContext が実装すべきメソッド getNamespaceURI() getPrefixes() getPrefix() を一通り見ました。 今回は、それらのメソッドに空文字列 ("") を渡したときの挙動を見ていきます(一覧)。以下で見る挙動は、API ド…

NamespaceContext の実装を考える (4) : メソッド getPrefix()

今回は NamespaceContext#getPrefix() メソッド(一覧)。NamespaceContext#getPrefix(String) の返り値 Java SE 6 の API ドキュメントを見ると、返り値は以下のように定義されています: 引数の名前空間 URI 返り値 http://www.w3.org/XML/1998/namespace …

NamespaceContext の実装を考える (3) : メソッド getPrefixes()

今回は、指定された名前空間 URI から、それに対応する接頭辞の Iterator を返すメソッド NamespaceContext#getPrefixes(String) を考えます(一覧)。NamespaceContext#getPrefixes(String) の返り値 Java SE 6 の API ドキュメントを見ると、返り値は以下…

NamespaceContext の実装を考える (2) : メソッド getNamespaceURI()

今回は、指定された接頭辞から、それに対応する名前空間 URI を返すメソッド NamespaceContext#getNamespaceURI(String) を考えます(一覧)。NamespaceContext#getNamespaceURI(String) の返り値 Java SE 6 の API ドキュメントを見ると、返り値は以下のよ…

NamespaceContext の実装を考える (1) : 抽象メソッド

javax.xml.namespace パッケージに定義されている NamespaceContext インターフェース(簡単にはこちらを参照)は、標準 API 内に実装クラスもファクトリ・クラスも提供されていません。 したがって、自分でインスタンスを作成したい場合には、自作クラスを…

XMLEventReader で SAX 解析

StAX 解析のサンプルとして、XMLEventReader を用いて SAX 解析を行うクラス StaxSAXParser を実装してみましょう。 ただし、XML イベントとして扱うのは org.xml.sax.ContentHandler が扱うもの*1とします(org.xml.sax.ext.LexicalHandler が扱うイベント…