Nokogiri доказал, что обладает некоторой скоростью и долговечностью, поэтому вот несколько примеров того, как обращаться с пространствами имен в примере XML. Я использовал Nokogiri для большого агрегатора RDF / RSS / Atom, который ежедневно обрабатывал тысячи каналов, используя что-то похожее на это, чтобы захватить поля, которые я хотел, прежде чем помещать их в серверную базу данных.
require 'nokogiri'
doc = Nokogiri::XML(file)
namespace = {'xmlns' => 'http://www.w3.org/2005/Atom'}
entries = []
doc.search('//xmlns:entry', namespace).each do |_entry|
entry_hash = {}
%w[title updated published author].each do |_attr|
entry_hash[_attr.to_sym] = _entry.at('//xmlns:' << _attr, namespace).text.strip
end
entry_hash[:headlines] = _entry.search('xmlns|hedline > hl1, xmlns|hedline > hl2', namespace).map{ |n| n.text.strip }
entry_hash[:body] = _entry.at('//xmlns:body.content', namespace).text.strip
entry_hash[:title] = _entry.at('//xmlns:title', namespace).text
entries << entry_hash
end
require 'pp'
pp entries
# >> [{:title=>"US--xxx-xxxxx",
# >> :updated=>"2009-08-19T15:49:51.103Z",
# >> :published=>"2009-08-19T15:44:48Z",
# >> :author=>"XX",
# >> :headlines=>["headline", "blah blah"],
# >> :body=>"story content here"}]
И CSS, и XPath в Nokogiri могут обрабатывать пространства имен. Nokogiri упростил бы их использование, захватив все пространства имен, определенные в корневом узле, но в этом примере XML пространство имен определено в узле ввода, что заставляет нас делать это вручную.
Я переключился на нотацию CSS для заголовков, просто чтобы показать, как их делать. Для удобства Nokogiri обычно разрешил бы пространство имен с подстановочными символами для CSS, если бы ему удалось найти объявление пространства имен, что упростило бы средство доступа до '|headline > hl1'
для узла hl1
.