2009-06-28

DOM XPath を理解したが、使い物にならん

Document Object Model XPath

DOM XPathは、多くのブラウザでサポートされている。しかし、その実装が、現実的に理解できない。

本物のXHTMLに対してXPathを用いるには、名前空間を明示的に指定しなければならない。省略不可能である。何故だ。何故なのだ。普通、XHTMLの要素に対しては、具体的な名前空間を使うことは、まずない。たとえば、

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html >
<html xmlns:ジョジョ="http://www.w3.org/1999/xhtml" >
<ジョジョ:head>
<ジョジョ:title> 岸部露伴語録集 </ジョジョ:title>
</ジョジョ:head>
<ジョジョ:body>
<ジョジョ:p>
今…家がない……<ジョジョ:br />
康一くんのとこ泊めてもらってるし<ジョジョ:br />
漫画描く机もない<ジョジョ:br />
「セーラームーン」のフィギアも<ジョジョ:br />
「レッド・ツェッペリン」の紙ジャケも<ジョジョ:br />
「るろうに剣心」も全部売っ払っちまった
</ジョジョ:p>
</ジョジョ:body>
</html>

こんなXHTMLを書く奴はいない。皆、XHTMLの名前空間を、わざわざ指定したりしないのだ。そもそも、xmlnsすら、だれも考えて使ってはいない。その意味を理解して使っている人間はすくない。ただ、おまじないに成り下がっている。そこで、XHTML5では、xmlnsもいらないんじゃね、ということになっている。

そして、実際のドキュメントでは名前空間を使っていないにもかかわらず、DOM XPathでは、なぜか名前空間を指定しなければならない。それが面倒なので、ある人は、こういう場当たり的なコードを書いている。このリンク先でやっていることといえば、XPathでは、記述を楽にするため、使っていないはずの一文字名前空間を使い、さらに、愚直にあらゆる名前空間に対してXHTMLのURIを返すXPathNSResolverを実装しているのだ。もはや、XHTMLを使う理由が分からない。厳格に使えないのであれば、そもそもXHTMLを使う必要などない。

そもそも、jQueryを初めとした一連のJavascriptライブラリは、別にCSSのセレクタを、要素検索の言語として選ぶ必要はなかったのである。XPathでも良かったのである。Javascript上でXPathを実装するのは、不可能ではない。ところが、そんな酔狂なライブラリは出なかった。CSSのセレクタに、親要素を選ぶだとか、何番目の要素を選ぶだとかの、軽い独自拡張を施した程度の検索用言語で、皆満足している。思うに、誰も、XPathのような複雑怪奇で、正規表現とも比すべき読みにくさを誇る言語を使いたくなかったのだろう。

これを考えるに、W3Cの規格を書いている人間は、何か特別にすばらしいものを吸っているとしか思えない。その吸っているものがあまりにすばらしすぎるので、まともに現実をみることができていないのだ。

4 comments:

nnm said...

XPathはHTML(XHTML)を操作するために作られたものじゃないからじゃないですか?

hito said...

XPathはXMLを操作するために作られたもので、XHTMLはXMLです。
したがって、XHTMLに対して使うことは、ごく自然なことだと思います。
XPath自体は悪くないのですが、具体的なAPIである、DOM XPathの規格が変なのです。
そもそもXMLの名前のない名前空間がどういう扱いになるのかよく分かりません。

HTMLはXHTMLほど厳格ではないにせよ、ドキュメントは同じくツリーで表せるので、XPathを使うのも、特に間違ったことだとは思いません。

os0x said...

いやはや滑稽なお話ですね。

まあ折角なので場当たり的なコードについて、少しだけ補足させて頂きます。
私がXPathを使用するのはユーザーサイドのJavaScriptを書く場合です。多くの場合、様々なサイトから要素を抽出し、それらに対して操作を行います。
中にはXHTMLで書かれたサイトもありますし、HTMLとは呼べないようなサイトもあります。そういったサイトでも汎用的に使えるようにしたものが件の場当たり的なコードです。
なので、「XHTMLを使う理由が分からない」については私もわからないとしか言いようがありません。そもそも、自分でHTMLを書くならXPathという面倒な方法で要素にアクセスしようとも思いません。適切にIDを振っておけばCSSのセレクタすら使うまでもないので、getElementByIdを使います。

hito said...

まあ、確かにXPathは少々読みにくいんですよね。
自分で書くぶんには、idふっておくのが一番楽ですね。