名前空間で区別したノードを、XPath式一発で取得する
ちょっと前に仕事で考えることがあったので、
忘れないうちに書いておく
これで
<?xml version='1.0'?> <root> : <ns:hoge xmlns:ns='fuga'> : </ns:hoge> : </root>
とかってXMLから真ん中のノードが取れる(ハズ)
詳細は、気が向いたら週末にでも追記する。
(追記)
何が問題だったか
たいていのXPathライブラリは、実際のXPath実行の前に、
“これから使うXPath式では、名前空間fugaを表すプレフィックスとして「fugapx」を使いますよ”みたいな準備をする。
で、そのあと
//fugapx:hoge
みたいな式を実行してノードを取得する。なのでプログラム的には1行でとりにくい。
しかもこの中の「fugapx」は単なる接頭辞でしかなく、
ほんとに重要なのは名前空間fugaなのに、XPath式にfugaが出てこないのだ。
これが遠回りしているように感じさせていた。
しかも対象のXMLの名前空間が変われば、
前述の名前空間とプレフィックスの対応を定義する部分のコードも改めて書き直さねばならず、
修正範囲はXPath式にとどまらない。
つまり対象のXMLがどんなに変わろうとも、変えるのはXPath式だけにしたくて、
(遅くてもいいから)どんなノードも取れるXPath式を考えたかった。
で最初の式が出てきた次第でして。
アレなら、名前空間が変わったら、XPath式内の名前空間(namespace-uri()で比較している部分)を変えればいいし、
タグが変わったなら、XPathの名前比較(local-name)の部分を変えれば終了。
プレフィックスが変わったくらいなら、何も変える必要はない。
そして、名前空間とプレフィックスの対応を定義する部分のコードも不要となる(はず)
以上。