2012-03-03 2 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

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 заранее. (Это работает только если URLs в документе карты 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') 
Смежные вопросы