Вы можете искать узлы entry
, а затем заглядывать внутрь каждого из них, чтобы извлечь узлы с пространством имен gphoto
:
require 'nokogiri'
doc = Nokogiri::XML(open('./test.xml'))
hashes = doc.search('//xmlns:entry').map do |entry|
h = {}
entry.search("*[namespace-uri()='http://schemas.google.com/photos/2007']").each do |gphoto|
h[gphoto.name] = gphoto.text
end
h
end
require 'ap'
ap hashes
# >> [
# >> [0] {
# >> "id" => "5582695833628950881",
# >> "name" => "Melody19Months",
# >> "location" => "",
# >> "access" => "public",
# >> "timestamp" => "1299649559000",
# >> "numphotos" => "37",
# >> "user" => "soopingsaw",
# >> "nickname" => "sooping",
# >> "commentingEnabled" => "true",
# >> "commentCount" => "0"
# >> }
# >> ]
Возвращает все //entry/gphoto:*
заметки. Если вы хотите только определенные, вы можете отфильтровать то, что вы хотите:
require 'nokogiri'
doc = Nokogiri::XML(open('./test.xml'))
hashes = doc.search('//xmlns:entry').map do |entry|
h = {}
entry.search("*[namespace-uri()='http://schemas.google.com/photos/2007']").each do |gphoto|
h[gphoto.name] = gphoto.text if (%w[id thumbnail name numphotos].include?(gphoto.name))
end
h
end
require 'ap'
ap hashes
# >> [
# >> [0] {
# >> "id" => "5582695833628950881",
# >> "name" => "Melody19Months",
# >> "numphotos" => "37"
# >> }
# >> ]
Обратите внимание, что в исходном вопросе происходит попытка доступа к gphoto:thumbnail
, однако для //element/gphoto:thumbnails
нет соответствующего узла, поэтому он не может быть найден.
Другой способ написать поиск с использованием пространства имен:
require 'nokogiri'
doc = Nokogiri::XML(open('./test.xml'))
hashes = doc.search('//xmlns:entry').map do |entry|
h = {}
entry.search("*").each do |gphoto|
h[gphoto.name] = gphoto.text if (
(gphoto.namespace.prefix=='gphoto') &&
(%w[id thumbnail name numphotos].include?(gphoto.name))
)
end
h
end
require 'ap'
ap hashes
# >> [
# >> [0] {
# >> "id" => "5582695833628950881",
# >> "name" => "Melody19Months",
# >> "numphotos" => "37"
# >> }
# >> ]
Вместо того, чтобы использовать XPath, он просит Нокогири посмотреть атрибуты пространства имен каждого узла.