Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

include REXML

class MyListener

 include REXML::StreamListener

 def tag_start(*args)

puts "tag_start: #{args.map {|x| x.inspect}.join(', ')}"

 end

 def text(data)

return if data =~ /^\w*$/ # Ничего, кроме пропусков.

abbrev = data[0..40] + (data.length > 40 ? "..." : "")

puts " text : #{abbrev.inspect}"

 end

end

list = MyListener.new

source = File.new "books.xml"

Document.parse_stream(source, list)

В

этом нам поможет класс
StreamListener
; сам по себе он содержит только заглушки, то есть пустые методы обратного вызова. Вы должны переопределить их в своем подклассе. Когда анализатор встречает открывающий тег, он вызывает метод
tag_open
. Можете считать это чем-то вроде метода
method_missing
, которому в качестве параметра передается имя тега (и все его атрибуты в форме хэша). Аналогично работает метод
text
; о других методах вы можете прочитать в документации на сайтеили в каком-нибудь другом месте.

Программа в листинге 15.3 протоколирует обнаружение каждого открывающего и каждого закрывающего тега. Результат работы показан в листинге 15.4 (для краткости текст приведен не полностью).

Листинг 15.4. Результат работы программы потокового разбора

tag_start: "library", {"shelf"=>"Recent Acquisitions"}

tag_start: "section", {"name"=>"Ruby"}

tag_start: "book", {"isbn"=>"0672328844"}

tag_start: "title", {}

text : "The Ruby Way"

tag_start: "author", {}

text : "Hal Fulton"

tag_start: "description", {}

text : "Second edition. The book you are now read..."

tag_start: "section", {"name"=>"Space"}

tag_start: "book", {"isbn"=>"0684835509"}

tag_start: "title", {}

text : "The Case for Mars"

tag_start: "author", {}

text : "Robert Zubrin"

tag_start: "description", {}

text : "Pushing toward a second home for the huma..."

tag_start: "book", {"isbn"=>"074325631X"}

tag_start: "title", {}

text : "First Man: The Life of Neil A. Armstrong"

tag_start: "author", {}

text : "James R. Hansen"

tag_start: "description", {}

text : "Definitive biography of the first man on ..."

15.1.3. XPath

и другие интерфейсы

Альтернативным способом работы с ХМL-документом является язык XPath, с помощью которого описывается, как обратиться к конкретным элементам и атрибутам XML-документа.

Библиотека REXML поддерживает XPath с помощью класса XPath. Предполагается, что документ представлен в виде DOM (см. выше листинг 15.2). Рассмотрим следующий код:

# (Этап подготовки опущен.)

book1 = XPath.first(doc, "//book") # Найдена информация о первой книге

р book1

# Распечатать названия всех книг.

XPath.each(doc, "//title") { |e| puts e.text }

# Получить массив всех элементов "author".

names = XPath.match(doc, "//author").map {|x| x.text }

p names

Вот что он напечатает:

<book isbn='0672328844'> ... </>

The Ruby Way

The Case for Mars

First Man: The Life of Neil A. Armstrong

["Hal Fulton", "Robert Zubrin", "James R. Hansen"]

REXML поддерживает также API на основе стандарта SAX2 (с некоторыми добавлениями в духе Ruby) и экспериментальный анализатор на основе технологии «вытягивания». Они в этой книге не рассматриваются - можете обратиться к сайтуили аналогичному ресурсу.

15.2. RSS и Atom

Часто изменяющийся контент распространяется в Интернете с помощью синдицированных каналов, или просто каналов. Обычно данные описываются на некотором диалекте языка XML.

Наверное, из всех форматов подобного рода наиболее распространен формат RSS. Эта аббревиатура означает Rich Site Summary (обогащенная сводка сайта), хотя некоторые расшифровывают ее как RDF Site Summary, понимая под RDF Resource Description Format (формат описания ресурса).

В сети Web очень много временной или часто изменяемой информации: записи в блогах, статьи в онлайновых журналах и т.д. Канал представляет собой естественный способ распространения и синдицирования такого контента.

Еще одним популярным форматом является Atom; некоторые даже считают, что он превосходит RSS. Но вообще-то сейчас предпочитают говорить не «RSS-канал» или «Atom-канал», а просто «канал».

Мы вкратце рассмотрим обработку форматов RSS и Atom. В первом случае применяется стандартная библиотека Ruby, во втором — библиотека, еще не вошедшая в стандартный дистрибутив.

Поделиться:
Популярные книги

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

Курсант поневоле

Шелег Дмитрий Витальевич
1. Кровь и лёд
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Курсант поневоле

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

Как я строил магическую империю 4

Зубов Константин
4. Как я строил магическую империю
Фантастика:
боевая фантастика
постапокалипсис
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 4

Я Гордый часть 7

Машуков Тимур
7. Стальные яйца
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Я Гордый часть 7

Газлайтер. Том 12

Володин Григорий Григорьевич
12. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 12

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Офицер Красной Армии

Поселягин Владимир Геннадьевич
2. Командир Красной Армии
Фантастика:
попаданцы
8.51
рейтинг книги
Офицер Красной Армии

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.00
рейтинг книги
Дважды одаренный. Том V

Газлайтер. Том 6

Володин Григорий
6. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 6

Тринадцатый V

NikL
5. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый V

Позывной "Князь" 2

Котляров Лев
2. Князь Эгерман
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Позывной Князь 2