XPath で、Doctype 宣言以外のコメントだけ抜き出す

Pocket

DOM level3 に対応したブラウザで使える、 javascript の document.evaluate であれば、XPath ですべてのコメントを抜き出すときに、

var result = document.evaluate("//comment()", document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

等としておけば問題ないが、一部の HTML パーサでは、HTML の DOCTYPE 宣言もコメントとして扱ってしまうものがある。
…と言うより、 “<!” で始まって、”>” で終わるものはすべてコメントとして扱ってしまうような場合について。

たとえば、.NET 向けの HTML パーサ HtmlAgilityPack がまさにそれなのだが、これを例に挙げてみる。
[CSharp]”//comment()[not(starts-with(translate(., ‘CDEOPTY’, ‘cdeopty’), ‘‘<!doctype’ と一致するかどうかをチェックしている。

HtmlAgilityPack の場合は、コメントの開始タグと終了タグも、コメントとして扱うため、starts-with 関数で比較する際に、コメントタグも含めているが、これはパーサの実装にも寄るので、適当に書き換えて欲しい。
(HtmlAgilityPack の場合、<!--comment--> 述部で比較対象になるのは、<!--comment--> 全体となるが、たとえば DOM lv.3 の evaluate の場合は、comment の部分だけになる)

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください