2012-03-03 21 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') 

我還沒有確定這是否是與引入nokogiri或預期的行爲的錯誤,但它會是值得討論的郵件列表或創建一個問題。

+0

它的工作原理!謝謝 :) – CrazyLion 2012-03-03 17:04:25

2

@BenTaitelbaum這是預期的行爲。 http://nokogiri.org/Nokogiri/XML/Node.html#method-i-xpath

不同的文檔可以爲相同的命名空間提供不同的前綴。例如,本文檔使用「xs」作爲「http://www.w3.org/2001/XMLSchema」的命名空間前綴。但其他一些文檔可能會使用「xmls」。通過提供名稱空間映射,即使前綴不同,xpath方法也會始終找到位於'http://www.w3.org/2001/XMLSchema'名稱空間中的節點。他們這樣做是因爲URL是普遍唯一的,但是前綴不是並且可能會發生衝突,並且在每個節點上使用URL都是單調乏味的,而不是XML曾經與那個(zing)有過矛盾。

很好看的:http://tenderlovemaking.com/2009/04/23/namespaces-in-xml/

你的方法是正確的/好/健康。但本着完整的精神,這裏有一些其他的選項是陰暗的,可能會傷害到你:

如果你想通過命名空間前綴而不是URL來查詢(這可能是一個壞主意),你可以collect all the namespaces預先。如果你想完全忽略命名空間(這可能是一個壞主意(這隻能如果文檔結構圖1對1前綴的網址。如果他們不這樣做,這可能會失敗)

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') 
相關問題