Используйте XPath, указав пространство имен для элементов g
. Поскольку ваш корневой элемент объявляет xmlns:svg
таким же, как новое пространство имен по умолчанию (xmlns
), вы можете использовать svg
в качестве префикса:
require 'nokogiri'
doc = Nokogiri.XML(IO.read('contents.xml'))
layers = doc.xpath('//svg:g[@inkscape:groupmode="layer"]')
p layers.map{ |layer| layer['id'] }
#=> ["layer1", "g2818"]
Расшифровано, вышеупомянутый XPath говорит:
//
- на любом уровне документа
svg:g
-… найти g
элементов с пространством имен, совпадающим с svg
пространством имен
[…]
-… но только если соблюдается содержание
@inkscape:groupmode
-… есть атрибут (@
) с именем groupmode
с пространством имен, соответствующим inkscape
="layer"
- и внутренним значением этого атрибута является текст layer
.
В качестве альтернативы, если вы просто пытаетесь прочитать этот файл (а не манипулировать и повторно сохранить его), вы можете использовать грубый, но упрощающий взлом удаление всех пространств имен. В этом случае ваш оригинальный код работает просто:
doc.remove_namespaces!
p doc.css('g[groupmode="layer"]').map{ |g| g['id'] }
#=> ["layer1", "g2818"]