@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')
это работает !! благодаря :) – CrazyLion