2013-09-23 4 views
1

Я искал способ найти узлы элементов с определенным атрибутом и найденным: «Use Nokogiri to get all nodes in an element that contain a specific attribute name»Как получить узлы с определенным атрибутом, который содержит двоеточие?

Однако, он не работает, когда атрибут имеет двоеточие, например «Foo: бар», как в

<abc foo:bar="hello"></abc> 

(да, его действительный).

Однако, когда я использую:

elements = @doc.xpath("//*[@foo:bar]") 

я получаю:

unexpected ':' after '#<Nokogiri::CSS::Node:0x107458870>' (Nokogiri::CSS::SyntaxError) 

И, когда я использую:

elements = @doc.xpath("//*[@foo\\:bar]") 

я получаю:

Invalid predicate: //*[@foo\:bar] (Nokogiri::XML::XPath::SyntaxError) 

Есть ли у кого-нибудь предложения?

$ nokogiri -v 
# Nokogiri (1.5.6) 
--- 
nokogiri: 1.5.6 
warnings: [] 

ruby: 
    version: 1.8.7 
    engine: mri 
    description: ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin11.0] 
    platform: universal-darwin11.0 
libxml: 
    loaded: 2.7.3 
    compiled: 2.7.3 
    binding: extension 

Эти старые версии?

+1

Какую версию Ruby, Nokogiri и LibXML вы используете? Введите 'nokogiri -v' в командной строке и добавьте эту информацию в свой вопрос, отредактировав ее. –

+0

Это не атрибут с двоеточием, это пространство имен. Если пространство имен не зарегистрировано на корневом узле, вам необходимо зарегистрировать его самостоятельно. –

ответ

1

Должно работать. См. Следующий пример кода:

require 'nokogiri' 
doc = Nokogiri::XML('<root xmlns:foo="http://www.example.com/"><abc foo:bar="hello"></abc></root>') 
doc.xpath('//*[@foo:bar]') 
# => #<Nokogiri::XML::Document:0x61ca74 name="document" children=[#<Nokogiri::XML::Element:0x61c63c name="root" children=[#<Nokogiri::XML::Element:0x61c3e4 name="abc" attributes=[#<Nokogiri::XML::Attr:0x61c36c name="bar" namespace=#<Nokogiri::XML::Namespace:0x61c088 prefix="foo" href="http://www.example.com/"> value="hello">]>]>]> 
+0

Это работает только потому, что вы определили пространство имен на корневом узле. Если это было определено в другом месте, метод 'xpath()' должен был бы добавить информацию о пространстве имен. –

Смежные вопросы