XML может иметь пробелы и не влиять на качество содержащихся в нем данных. Хороший синтаксический анализатор, с помощью которого вы должны обрабатывать XML, не заботится и предоставит вам доступ к данным независимо от того, есть пробелы или нет.
Nokogiri - это мой любимый предмет, и, похоже, в наши дни он фактически является стандартом для Ruby. Он очень прост в использовании, но вам нужно научиться определять, какие узлы вам нужны.
Чтобы начать, вот несколько терминов:
- Узел - это термин для тега после его анализа.
- Узлы имеют атрибуты, доступ к которым можно получить с помощью
node_var['attribute']
.
- Доступ к тексту узла можно получить с помощью
node_var.text
или node_var.content
или node_var.inner_text
.
- NodeSet - это в основном массив узлов.
at
возвращает первый узел, соответствующий методу доступа, который вы предоставляете парсеру. %
это псевдоним.
search
возвращает NodeSet узлов, соответствующих методу доступа, который вы предоставляете синтаксическому анализатору. /
это псевдоним.
Вот как мы можем разобрать фрагмент XML:
require 'nokogiri'
xml =<<EOT
<newsitem
id="5185807"
title="Lost Chrome messenger PBR bag and contents (marina / cow hollow)"
url="http://sf.everyblock.com/lost-and-found/by-date/2011/5/17/5185807/"
location_name="Van Ness and Filbert"
schema="lost-and-found"
schema_id="7"
pub_date="May 17, 2011, 12:15 p.m."
longitude="-122.424129925"
latitude="37.7995100578">
<attributes>
<attribute name="item_date">May 17, 2011</attribute>
<attribute name="external_url">http://sfbay.craigslist.org/sfc/laf/2386709187.html</attribute>
</attributes>
</newsitem>
EOT
doc = Nokogiri::XML(xml)
doc.at('newsitem').text # => "\n \n May 17, 2011\n http://sfbay.craigslist.org/sfc/laf/2386709187.html\n \n"
(doc % 'attribute').content # => "May 17, 2011"
doc.at('attribute[name="external_url"]').inner_text # => "http://sfbay.craigslist.org/sfc/laf/2386709187.html"
doc.at('newsitem')['id'] # => "5185807"
newsitem = doc.at('newsitem')
newsitem['title'] # => "Lost Chrome messenger PBR bag and contents (marina / cow hollow)"
attributes = doc.search('attribute').map{ |n| n.text }
attributes # => ["May 17, 2011", "http://sfbay.craigslist.org/sfc/laf/2386709187.html"]
attributes = (doc / 'attribute').map{ |n| n.text }
attributes # => ["May 17, 2011", "http://sfbay.craigslist.org/sfc/laf/2386709187.html"]
Все виды доступа используют CSS, так же, как вы используете при написании веб-страниц. Это проще и, как правило, более понятно, но Nokogiri также поддерживает XPath, который является очень мощным и позволяет перенести большую часть обработки в базовую библиотеку libXML2, которая будет работать очень быстро.
Nokogiri очень хорошо работает с Ruby's Open-URI
, поэтому, если вы получаете XML с веб-сайта, вы можете сделать это следующим образом:
require 'open-uri'
require 'nokogiri'
doc = Nokogiri::HTML(open('http://www.example.com'))
doc.to_html.size # => 2825
Это синтаксический анализ HTML, в котором Nokogiri также отличается, но процесс для XML такой же, просто замените Nokogiri::HTML
на Nokogiri::XML
.
См. Также " Как избежать объединения всего текста с узлов при извлечении ".