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クラス図](http://cz-cdn.shoeisha.jp/static/images/article/448/HtmlConverterClassDiagram.jpg)
実際にコード上から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へ変換しました。これらの変換前と変換後のコードを比べると、どのように変換されるか分かると思います。
変換前 | 変換後 |
Microsoft | Microsoft 変換後 |
Google 検索結果 | Google 検索結果 変換後 |
Wikipedia | Wikipedia 変換後 |
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
クラスの中核となる解析、変換といった処理のほとんどは外部のクラスが行っています。
まずHtmlConverter
はHtmlParser
クラスのGetHtmlTreeElement
メソッドを呼び出し、前稿で紹介したTreeElement
クラスを利用して、HTML要素を表現するHtmlElement
クラスからなるHTMLのツリー構造を構築します。ツリーの構築は、同じく前稿で紹介したTreeElementVisitor
クラスでツリー内を移動しながら行っています。
HTMLソース文字列内の解析には、文字列を前後へ移動しながら取得することができるCharacterVisitor
という自作のクラスを利用しています。HTML要素の開始位置となる文字列 "<"、"<!"、">" などを移動しながら、タグや属性、テキスト、コメントなどの要素の解析に対応するIHtmlElementParser
を実装したインスタンスをHtmlElementParserFactory
によって生成し、そのパーサーからHtmlElement
を生成して取得します。
![HtmlConverterの内部構造 HtmlConverterの内部構造](http://cz-cdn.shoeisha.jp/static/images/article/448/HtmlConverterProcess.jpg)
HTMLツリー構造を表現するTreeElementクラス
HTMLはタグ、属性、テキスト、コメントによるツリー構造で構成されています。このツリー構造は次のようにTreeElement
クラスを利用して表現しています。
![TreeElementクラスを使用したHTMLツリー構造 TreeElementクラスを使用したHTMLツリー構造](http://cz-cdn.shoeisha.jp/static/images/article/448/HtmlTreeStructure.jpg)
まとめ
HtmlConverter
クラスを使用することで、さまざまな形式のHTMLリソースからSystem.Xml.XmlDocument
を生成することができます。また、HtmlConverterコンソールアプリケーションを利用することで、ファイルに保存されたHTMLソースやWebサイトのHTMLソースを簡単にXML形式に変換し保存することができます。
これらが、皆さんがネットワーク上のリソースなどからさまざまな情報を利用する際の足掛かりになれば幸いです。