SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

HTMLをXMLへ変換する自作クラス

WebサイトやローカルのHTMLソースをXML形式へ変換して利用する

  • X ポスト
  • このエントリーをはてなブックマークに追加

HtmlConverterのコード上からの使用方法

 HtmlConverterクラスを使用するには、コード上でHtmlConverterクラスを呼び出す方法と、サンプルファイル(実行ファイル)のコンソールアプリケーションからオプションを指定して呼び出す方法があります。

 コード上から使用する場合は、System.Xml.XmlDocument型へ変換できる型に次のようなものがあります。

  • HTMLソースが記述されている文字列System.String
  • Webサイト上のHTMLファイルのURLを示すSystem.Uri
  • HTMLソースが保存されているファイルを表すSystem.IO.FileInfo

 クライアントは、これらのインスタンスをHtmlConverterのコンストラクタに指定して初期化した後に、ToXmlDocumentメソッドを呼び出すことで、指定されたリソースから変換し生成されたSystem.Xml.XmlDocumentを取得することができます。

 HtmlConverterクラスのメンバは以下のクラス図を見ても分かるとおり、とてもシンプルです。

HtmlConverterクラス図
HtmlConverterクラス図

 実際にコード上からHtmlConverterクラスを利用する例を示します。

使用例
// コンストラクタ ( System.Uri 型を使用 )
HtmlConverter converter =
    new HtmlConverter( new Uri( "http://codezine.jp/" ) );

// 生成された XmlDocument を取得
HtmlConverter convertedXmlDocument = converter.ToXmlDocument();

 生成されたSystem.Xml.XmlDocumentは次のようになります(変換されたXMLファイルはHtmlConverterコンソールアプリケーションを使用して作成しました)。

 サンプルとしていくつかのWebサイトのHTMLソースをXMLへ変換しました。これらの変換前と変換後のコードを比べると、どのように変換されるか分かると思います。

HtmlConverterコンソールアプリケーションの使用方法

 コード上からの使用に比べると多少速度が遅くなりますが、ファイルに保存されているHTMLソースをドラッグ&ドロップでXMLファイルへ変換できたり、バッチファイルを利用して複数のWebサイトからHTMLソースを取得して複数のXMLファイルを作成したりと便利に利用することができます。

 以下に、HtmlConverterコンソールアプリケーションの構文と指定するオプションを示します。

構文
HtmlConverter [変換元リソースパス] [出力先ファイルパス]
 [/encoding:エンコーディング名] [/appendBaseTag] [/noDialog]
使用例
HtmlConverter http://codezine.jp/
HtmlConverter example.htm
HtmlConverter http://www.microsoft.com/ convertedHtml.xml /encoding:utf-8
HtmlConverter http://www.google.co.jp/ /encoding:shift_jis /appendBaseTag
オプション
オプション名説明
変換元リソースパスXMLへ変換するHTMLリソースのパスを記述します。パスにはURLまたはファイルパスを使用できます。convertHtml.htm
または
http://codezine.jp/ など
出力先ファイルパス
(*省略可)
XMLへ変換したファイルの出力先のファイルパスを記述します。省略した場合は、実行したカレントディレクトリに 「converted.xml」 というファイル名で出力されます。convertedHtml.xml
または
convertedHtml.txtなど
/encoding:[エンコーディング名]
(*省略可)
指定されたリソースからのデータの読み取り、および出力時の書き込みの際に使用するエンコーディング名を指定します。省略された場合は、システムのデフォルトのエンコーディングが使用されます(システムが日本語の場合は、Shift-Jisになります)。このエンコーディング名は内部でSystem.Text.Encoding.GetEncoding( String ) メソッドによってSystem.Text.Encoding型のインスタンスを生成する際に使用されます。具体的に使用できる文字列はMSDNのEncoding.GetEncodingsメソッド(System.Text)を参考にしてください。/encoding:shift_jis
または
/encoding:utf-8
または
/encoding:euc-jpなど
/appendBaseTag
(*省略可)
このオプションを記述すると、変換されたXMLファイル内のheadタグ内に、リソース元のURLまたはファイルパスを元に作成されたbaseタグが追加されます。baseタグは変換後のXMLファイルの拡張子をhtmlに変更してブラウザなどで表示させる際などに相対パスで記述された画像やリンクの参照を有効にするために利用されます。省略した場合は追加されません。/appendBaseTag
/noDialog
(*省略可)
このオプションを記述すると変換完了時などに表示される通知ダイアログが非表示になります。多数のリソースを変換する際などに指定するとすべてのリソースを自動的に処理されるので便利です。/noDialog

 簡単にコンソールの動作を試すことができるように、いくつかのWebサイトを変換するデモンストレーションとして「Demonstration.bat」というバッチファイルをアーカイバ内に同封してありますので、よろしければ実行してみてください。

HtmlConverter内部構造

 HtmlConverterクラスの中核となる解析、変換といった処理のほとんどは外部のクラスが行っています。

 まずHtmlConverterHtmlParserクラスのGetHtmlTreeElementメソッドを呼び出し、前稿で紹介したTreeElementクラスを利用して、HTML要素を表現するHtmlElementクラスからなるHTMLのツリー構造を構築します。ツリーの構築は、同じく前稿で紹介したTreeElementVisitorクラスでツリー内を移動しながら行っています。

 HTMLソース文字列内の解析には、文字列を前後へ移動しながら取得することができるCharacterVisitorという自作のクラスを利用しています。HTML要素の開始位置となる文字列 "<"、"<!"、">" などを移動しながら、タグや属性、テキスト、コメントなどの要素の解析に対応するIHtmlElementParserを実装したインスタンスをHtmlElementParserFactoryによって生成し、そのパーサーからHtmlElementを生成して取得します。

HtmlConverterの内部構造
HtmlConverterの内部構造

HTMLツリー構造を表現するTreeElementクラス

 HTMLはタグ、属性、テキスト、コメントによるツリー構造で構成されています。このツリー構造は次のようにTreeElementクラスを利用して表現しています。

TreeElementクラスを使用したHTMLツリー構造
TreeElementクラスを使用したHTMLツリー構造

まとめ

 HtmlConverterクラスを使用することで、さまざまな形式のHTMLリソースからSystem.Xml.XmlDocumentを生成することができます。また、HtmlConverterコンソールアプリケーションを利用することで、ファイルに保存されたHTMLソースやWebサイトのHTMLソースを簡単にXML形式に変換し保存することができます。

 これらが、皆さんがネットワーク上のリソースなどからさまざまな情報を利用する際の足掛かりになれば幸いです。

参考資料

  1. W3C / Extensible Markup Language (XML) 1.0 日本語訳

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

角尾 良太(カクオ リョウタ)

.NETの楽しさと力強さ、そしてJavaの美しさなど色々な観点からプログラミングの楽しさをたくさんの人と共有できたら良いなと願う.NETプログラマ。以下のサイトで制約モデルのテストやバリデーションに関するフレームワークライブラリを公開しています。 NKiwi Framework ライブラリ

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/448 2006/07/17 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング