Ruby 初心者スレッド Part 15

このエントリーをはてなブックマークに追加
358331
テスト用じゃない実際に使うXMLファイルだとだめだった・・・
何が違うんだorz
359331:2007/11/11(日) 18:03:38
ルート要素に「xmlns」ていう名前のアトリビュート(接頭辞は省略)があると
だめだった。

doc.elements[".//b[@name='B3']"]

てやってもnilが返ってきちゃう。

XMLドキュメント内の要素には接頭辞は一切使用していないので
全てルート要素で定義したデフォルトの名前空間になってるし、
アトリビュートの指定で名前空間て関係してくるの?

なんでルート要素でデフォルト名前空間を宣言すると
doc.elements[".//b[@name='B3']"]
の返り値がnilになっちゃうの?
誰か教えて。
360デフォルトの名無しさん:2007/11/11(日) 18:29:15
>>359
名前空間指定してないからに決まっているだろ
361デフォルトの名無しさん:2007/11/11(日) 20:35:13
えー。
だったら同じように名前空間を指定していない
doc.elements[".//b"]
でも返り値はnilになるんじゃないの?
362デフォルトの名無しさん:2007/11/12(月) 00:22:22
>>359
ルート要素でデフォルト名前空間を設定しているからというより
bが名前空間URIを持っているからマッチしないんだという気がする。
XPathの中では実際の文書の接頭辞は意味ないからな。

doc.elements['//b']の返り値はバグのような気がする。
libxml-rubyで同様の処理をするとdoc.find("//b")は空のノードセットを返す。

#!/usr/bin/ruby -Ku
require 'xml/libxml'
require 'pp'

parser = XML::Parser.new
parser.string = <<EOS
<root xmlns='http://example.com/'>
<a id="AAAAAe77057dcc82dbf40b81595e09291a" name="A1">
<b id="BBBBBe77057dcc82dbf40b81595e09291a" name="B1"/>
</a>
<a id="CCCCCe77057dcc82dbf40b81595e09291a" name="A2">
<b id="DDDDDe77057dcc82dbf40b81595e09291a" name="B2"/>
<b id="EEEEEe77057dcc82dbf40b81595e09291a" name="B3"/>
</a>
</root>
EOS
doc = parser.parse

p doc.find("//b").class
p doc.find("//x:b",'x:http://example.com/')
p doc.find("//x:b[@name='B3']",'x:http://example.com/')