最近C#(VisualStudio)でツール作ることが多いのですが、HTMLのページを解析する方法を検索すると必ず上がってくるHtmlAgilityPackと言うライブラリがあります。
非常に便利なライブラリなのですが、読み込み&解析だけではなく作成(加工)&出力も出来ます。
ネットでHTML出力方法とか検索してもHtmlAgilityPackを使った方法はあまりヒットしなかったのでメモっておきます。
読み込み&解析についてはそこらに転がっているので割愛。
作成(加工)&出力は以下のようにすれば出来ました。
テーブルを作るサンプルです。
// インスタンス作成
HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
// table タグを作成
HtmlNode table = html.CreateElement("table");
// tr タグを作成
HtmlNode tr = html.CreateElement("tr");
// td タグを作成
HtmlNode td = html.CreateElement("td");
// td へデータを設定
td.SetAttributeValue("class", "test"); // 属性 class に test を設定
td.InnerHtml = "表示テキスト"; // 文字列を設定
// 階層を設定
tr.AppendChild(td);
table.AppendChild(tr);
// HTML出力
html.Save("C:\\test.html", Encoding.UTF8);
出力は以下のようになります(C:\test.htmlの内容)
<table><tr><td class="test">表示テキスト</td></tr></table>
こんな感じです。
非常に簡単です。
上の例ではテーブルタグだけを出力していますが、例えば以下のようなデータがあるとします。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="ja">
<title></title>
</head>
<body>
</body>
</html>
このデータをファイルから読み込むなりしてstringの変数に設定し、以下のようにするとデータを加工することが出来ます。
// 以下の変数に上記のHTMLの内容が入っている想定です。
// string strHtmlData;
// インスタンス作成
HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
// table タグを作成
HtmlNode table = html.CreateElement("table");
// tr タグを作成
HtmlNode tr = html.CreateElement("tr");
// td タグを作成
HtmlNode td = html.CreateElement("td");
// td へデータを設定
td.SetAttributeValue("class", "test"); // 属性 class に test を設定
td.InnerHtml = "表示テキスト"; // 文字列を設定
// 階層を設定
tr.AppendChild(td);
table.AppendChild(tr);
// HTMLを読み込む
html.LoadHtml(strHtmlData);
// タイトルタグを読み込んでHTMLのタイトルを設定する
HtmlNode head = html.DocumentNode.SelectSingleNode(@"//head//title");
head.InnerHtml = "HTMLのタイトルです";
// BODYを読み込んでテーブルを挿入します
HtmlNode body = html.DocumentNode.SelectSingleNode(@"//body");
body.AppendChild(table);
// HTML出力
html.Save("C:\\test.html", Encoding.UTF8);
出力は以下のようになります(C:\test.htmlの内容)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="ja">
<title>HTMLのタイトルです</title>
</head>
<body>
<table><tr><td class="test">表示テキスト</td></tr></table>
</body>
</html>
ちょっとしたテンプレートエンジンですね。
便利です。
タグに複数の属性を設定する方法もあると思うんですが調べ中。
たまにはPRCOkusawa(Program Resource Center Okusawa)っぽい記事も書いてみました…(笑) |