2012-03-03 26 views

答えて

1

この作品

感謝:

require 'nokogiri' 
require 'open-uri' 
doc = Nokogiri::XML(open('https://raw.github.com/gist/1966260/8769a795b2ba83ceea6aaa45365b01cf344087b0/gistfile1.xml')) 
doc.xpath('//xs:schema', 'xs' => 'http://www.w3.org/2001/XMLSchema') 

私はわからないんだけど、まだこれは鋸山または意図した動作とバグであれば、それはメーリングリストで議論または作成する価値があると思いますの問題。

+0

ありがとう:) – CrazyLion

2

@BenTaitelbaumこれは、意図された動作です。 http://nokogiri.org/Nokogiri/XML/Node.html#method-i-xpath

異なるドキュメントでは、同じ名前空間に対して異なる接頭辞を付けることができます。たとえば、このドキュメントでは、「http://www.w3.org/2001/XMLSchema」の名前空間接頭辞として「xs」を使用しています。しかし、他の文書では代わりに "xmls"を使用することがあります。名前空間マッピングを提供することにより、xpathメソッドは、接頭辞が異なっていても、 'http://www.w3.org/2001/XMLSchema'名前空間にあるノードを常に見つけます。 URLは普遍的にユニークですが、接頭辞は衝突しない可能性がありますし、すべてのノードのURLを使用するのは面倒で退屈です。

良い読み物:http://tenderlovemaking.com/2009/04/23/namespaces-in-xml/

あなたの方法は、健康的な/良い/権利です。しかし完全性の精神の中で、日陰であなたを傷つける可能性のあるオプションがあります:

URLではなく名前空間プレフィックスで照会したい場合は、collect all the namespaces予め。あなたは完全に、おそらく悪い考えである名前空間を(無視する場合(これは文書マップ1対1の接頭辞内のURLあればそうでない場合は、これは失敗する可能性があります。作品)

doc = Nokogiri::XML(open(the_url)) 
namespaces = doc.collect_namespaces 
doc.xpath('//xs:schema', namespaces) 

)、あなたはremove them entirelyです。

doc = Nokogiri::XML(open(the_url)) 
doc.remove_namespaces! 
doc.xpath('//schema') 
関連する問題