倭マン's BLOG

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

XML 解析向上委員会

ビルダーの本末転倒な使い方 Revolution

前にやった「ビルダーの本末転倒な使い方」、「ビルダーの本末転倒な使い方 Reloaded」って、よく考えたら、「ビルダーをイベントハンドラと思えば単なる Push 解析」ですねぇ。ってことで、サンプルコードをちょっと SAXParser 風にしてみると class PushPa…

ビルダーの本末転倒な使い方 Reloaded

「XML 文書を入力としてこのビルダーでツリー構造を構築させる方法」を Closure 使って実装する件(→)、冷静に考えれば案外簡単に出来ました。 def xml2builder = new XmlToBuilderReloaded() xml2builder.parseText(xml) class XmlToBuilderReloaded{ fina…

ビルダーの本末転倒な使い方

Groovy のビルダーを使っていてチョット思ったことをメモ。ビルダーは、XML のようなツリー構造を構築するのに便利なツールです。 例えば以下のような XML 文書は*1 <table customer='c' invoice='i'> <join c='invoice_id' i='id' /> <and> <greater i.total='1000' /> <like c.name='%Bill%' >desription</like> </and> </table> 次のようなビルダーで構築できます: def builder = new MarkupBuilder()…

XML 文書を読み込むのに InputStream と Reader どちらを使えばいい?

さて問題。 次のうち正しいのはどれ? XML 文書を読み込むのには InputStream よりは Reader を使う方がよい XML 文書を読み込むのには Reader よりは InputStream を使う方がよい XML 文書を読み込むのには Reader を使うべきである XML 文書を読み込むのに…

XML 文書のフォーマット 整理を試みる編 (3) : 空白のフォーマットについてもう少し

無視できる空白 以前は「無視できる空白 (ignorable whitespace)」を「使用できるノード」や「正規化できるノード」としても扱ってましたが、それを変更して、「無視できるノード」としてのみ扱います→(一覧)。「無視できる空白」を使用するかどうかは、フ…

XML 文書のフォーマット 整理を試みる編 (2) : XMLFormat のプロパティをさらに分類

今回は前回定義した XMLFormat をさらに分類します(一覧)。使用するノード型、無視できるノード型 XML 文書にはいろいろな型のノードが出てきますが、それらを使用したり、無視したりするのをフォーマットによって指定できるようにしましょう。個人的には…

XML 文書のフォーマット 整理を試みる編 (1) : XMLFormat と OutputFormat

以前に XML 文書のフォーマット「入力編」「出力編」というのをやりました*1。今回から何回かにわたって、それらからよく使いそうなものを「拙者の独断と偏見」で取捨選択して統合を試みてみます(一覧)。XMLFormat と OutputFormat SAX, StAX, DOM, JDOM, …

DOCTYPE 宣言を扱う (2):文字列の分割

今回は、前回とは逆に、 XML の DOCTYPE 宣言の文字列から、公開識別子やシステム識別子などの文字列を抜き出すサンプル・コードのメモ。公開識別子とシステム識別子のどちらもある場合 前回と同様に、まずは「公開識別子 (public ID) とシステム識別子 (sys…

DOCTYPE 宣言を扱う (1):文字列の連結

XML の DOCTYPE 宣言の文字列を構築するサンプル・コードのメモ。 DOCTYPE 宣言ってあんまりマジメに扱ったことないので、処理が間違ってる所もあるかも知れませんがご了承を。公開識別子とシステム識別子のどちらもある場合 まずは、一番よく見る DOCTYPE …

8. javax.xml.transform とのブリッジ (2) : Result

前回に引き続き、javax.xml.transform パッケージとのブリッジを考えます。 今回は javax.xml.transform.Result インターフェース。XMLEventResult まず、XMLEventResult クラスのサンプルコード。 XMLEventResult クラスは Result のサブタイプです。 publi…

7. javax.xml.transform とのブリッジ (1) : Source

今回と次回で、javax.xml.transform パッケージのクラスへのブリッジを考えます。 基本的な考え方は XMLEvent がベースです。 定義するクラスは XMLEvent を読み込む XMLEventSource と XMLEvent を書き出す XMLEventResult です。今回は javax.xml.transfor…

6. StAX とのブリッジ

前回は SAX とのブリッジ、というか SAX の成果物の再利用方法を見ました。 今回は、StAX の API を使用する方法を考えます。SAX では処理の実装はほとんど org.xml.sax.ContentHandler などのコールバック・クラス(XxxxHandler クラス)に定義されているの…

4. プッシュ・パース

プル・パースの次はプッシュ・パースを行う API を考えていきます。前回までは単に StAX の簡略版を作ってただけです。 今回はそれを SAX っぽく扱おうってだけです。XMLEventHandler インターフェースとそのデフォルト実装 プッシュ解析を行うには、SAX の …

3. プル・パース

今回は、前回定義した XMLEvent を用いて、プル・パースを行う API を考えます。XMLEventIterator インターフェースとその実装 まず、XMLEvent を列挙するインターフェース XMLEventIterator を定義しましょう。 StAX ではこの役割を XMLEventReader, XMLStr…

5. SAX とのブリッジ

プッシュ・パースを行う API としてすでに SAX があるので、SAX 解析を行う際に作成したクラスを利用できるようにしておいた方がよいでしょう。 今回は、前回までに作成したクラスで org.xml.sax.InputSource と org.xml.sax.ContentHandler を使用する方法…

2. XML イベントの簡略版オブジェクト・モデル

今回は XML イベントの簡略版オブジェクト・モデルを考えます。javax.xml.stream.events パッケージに定義されている XMLEvent 群を使ってもいいんですが、あんまりイベントの種類があっても面倒なので、この記事では「要素」と「テキスト」だけしかない XML…

1. プッシュ・パースとプル・パース

XML 文書の解析にはプッシュ・パース (push parsing) とプル・パース (pull parsing) ってのがあります。 通常、プッシュ・パースを行う API は SAX (org.xml.sax.**, javax.xml.parsers.*)、プル・パースを行う API は StAX (javax.xml.stream.**) を用いま…