HTML パーサ & ビルダー

このライブラリは well-formed XML ではなく valid でもない一般的な HTML 文書を標準の JAXP と同じ方法で扱えるようにする事を目的としています。ライブラリには SAX2 型の HTML パーサと DOM Level3 HTML ビルダーが含まれています。バンドルされているクラスの詳細はAPI リファレンスを参照してください。

HTML を対象としているため以下の点で通常の XML パーサと異なります。

  • 開始/終了記述の整合性が取れていない要素の補正
  • 要素名、属性名の大文字と小文字を区別しない解釈
  • <br> 等の HTML で定義されているいくつかの要素の特徴を認識

XML よりもルーズな文書の解析を行うため、プログラマの意図と異なる解釈を行う可能性がある事に十分注意してください。

HTML 文書がどのように解釈されるかの具体例はこちらを参照して下さい。これは実際にこのライブラリを使用して解析した HTML を再出力した結果です。

インターフェースや実際の利用方法は標準の JAXP に合わせてありますが、これはプログラマの利便性を考慮したもので JAXP 準拠を目指した物ではありません。

実行環境Java2 SE 5.0 以上
動作確認Windows XP, MacOS X 10.5 (Xerces)

HTML ドキュメントビルダー

HTML ドキュメントビルダーは非 well-formed な HTML 文書から DOM を生成するためのライブラリです。通常の DOM ビルダーではエラーで中断してしまうような HTML 文書から (時には強引に) DOM を構築する事を目的としています。このビルダーを使用して構築した DOM は XPath や Transformer などを用いてアプリケーションで扱うことが出来ます。

使用方法

HTML ドキュメントビルダーは newInstance() にファクトリクラス名を指定して構築を行います。それ以降の使い方は通常のドキュメントビルダーと同じです。

String factoryName = "org.koiroha.xml.parser.HTMLDocumentBuilderFactory";
DocumentBuilderFactory factory
    = DocumentBuilderFactory.newInstance(factoryName, loader);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(htmlFile);

上記のようにクラス名指定でなくても new を使用して直接的にファクトリを構築する事ができます。設計上、解析する文書が HTML だと確定しているのであればこちらの方が明示的で良いかもしれません。

import org.koiroha.xml.parser.*;

// ...
HTMLDocumentBuilderFactory factory = new HTMLDocumentBuilderFactory();

XHTML や well-formed に近い HTML は概ね常識的な DOM へ変換されますが、ルーズで癖の強い記述に対して万人が納得する解釈はできません。自分の意図した DOM が作成されているかを常に注意し、場合によっては補正用プログラムを追加で作成するつもりで使用してください。

実装機能

実装されている機能の詳細はAPI リファレンスを参照してください。ビルダー機能のほとんどは基盤となる HTML パーサ側で実装されています。

名前空間のサポート
通常のビルダーと同様に HTML 文書中で名前空間の指定されている要素や属性を認識して DOM を生成することが出来ます。
要素名/属性名の小文字への統一
HTML 解析時は要素名や属性名の大文字と小文字を区別しません。それぞれの名前を記述された通りに構築するか、XHTML のように小文字に統一するかを選択することが出来ます。
HTML要素の認識
HTML の特徴を認識する事でいくつかの要素では独立的な動作を行います。
  • <br>, <img> のような EMPTY と定義されている要素が必ず空となるように構築します。
  • <script>, <style> の他言語を内包する要素内の '<', '>' をテキストと見なします。
  • <li>, <p>, <option> など、歴史的に閉じない記述が許されている要素の正しい階層位置を推測します (オプション)。

HTML パーサ

HTML パーサは非 well-formed な HTML 文書を解析してコールバックをうけるためのライブラリです。HTML 文書内から特定の属性値のみを取得できればよい場合などに前述のビルダーより良好なパフォーマンスを得られます (HTML ビルダーは内部的に HTML パーサを使用しています)。

このパーサは非 well-formed な HTML 文書の解析を目的としているため、文書構造の整合性などは確認せずに出現した通りにコールバックを行います。つまりルート要素の外でテキスト出現が通知されたり、要素の終了通知がないままドキュメントが終了すると言った整合性のない呼び出しが発生します。HTML パーサに対する ContentHandler は通常の SAX パーサより注意深く実装を行う必要があります。

使用方法

HTML パーサは newInstance() にファクトリクラス名を指定して構築を行います。それ以降の使い方は通常の SAX パーサと同じです。また HTML ビルダーと同様に new による直接的な構築も行うことが出来ます。

String factoryName = "org.koiroha.xml.parser.HTMLParserFactory";
SAXParserFactory factory
    = SAXParserFactory.newInstance(factoryName, loader);
SAXParser parse = factory.newSAXParser();
parser.setContentHandler(myHandler);
parser.parse(htmlFile);

ダウンロード

sourceforge.jp のリリース一覧から xmllib_x.x.zip をダウンロードして下さい。このアーカイブにはコンパイルに必要な JAR ファイル、ソースの ZIP ファイル、javadoc の ZIP ファイルが含まれています。追加で必要なライブラリはありません。

開発情報

CVS :pserver:anonymous@cvs.sourceforge.jp:/cvsroot/koiroha-org/xmllib_1.0 (閲覧)
プロジェクト形式Eclipse 3.4.1 Java Project (UTF-8, LF)
ビルド方法Ant (build/build.xml を右クリックして [実行]-[Antビルド])
テスト方法JUnitのテストケース,dJUnitによる全経路通過
ステータスコーディング終了、テスト中

プロジェクトには Web 上の HTML を解析し、含まれているリンクを取得して自動巡回を行う耐久テストツールが含まれています (動作には Apache Derby が必要です)。

不具合報告や改善要望は sourceforge.jp の 公開討議フォーラムへ御願いします。ただし気が向いた時に作業しておりますのご了承ください。

Sun Java ダウンロードページ
SourceForge.JP
Valid XHTML 1.1