Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

5-минутное введение в XML. Структура формата синдикации фида Atom




5-минутное введение в XML

Если Вы уже знакомы с XML, то можете пропустить эту главу.

XML — это язык разметки для описания иерархии структурированных данных. XML документ содержит один или более элементов разделённых открывающими и закрывающими тегами. Это правильный, хотя и неинтересный, XML документ:

< foo> ① < /foo> ②

① Это открывающий (начальный) тег элемента foo.

② Это соответствующий закрывающий (конечный) тег элемента foo. Как в математике и языках программирования каждая открывающая скобка должна иметь соответствующую закрывающую, в XML каждый открывающий тег должен быть закрыт соответствующим закрывающим.

Элементы могут быть неограниченно вложены друг в друга. Так как элемент bar вложен в элемент foo, то его называют подэлементом или дочерним элементом элемента foo.

< foo> < bar> < /bar> < /foo>

Первый элемент каждого XML документа называется корневым. XML документ может содержать только один корневой элемент. Пример представленный ниже не является XML документом, так как он имеет два корневых элемента:

< foo> < /foo> < bar> < /bar>

Элементы могут иметь атрибуты состоящие из пары имя-значение. Атрибуты перечисляются внутри открывающего тега элемента и разделяются пробелами. [wаp-rоbin. com] Имена атрибутов не могут повторяться внутри одно элемента. Значения атрибутов должны быть обрамлены одинарными или двойными кавычками.

< foo lang='en'>                      ① < bar id='papayawhip' lang=" fr" > < /bar> ② < /foo>

① Элемент foo имеет один атрибут именованный как lang. Значению атрибута lang присваивается строка en.

② Элемент bar имеет два атрибута: id и lang. Значение lang есть fr. Это не приводит к конфликту с атрибутом lang элемента foo, так как каждый элемент имеет свой набор атрибутов.

Если элемент имеет больше чем один атрибут, то порядок атрибутов не играет роли. Атрибуты элементов есть неупорядоченный набор ключей и значений подобно словарям в Python. Для каждого элемента можно указать неограниченное число атрибутов.

Элементы могут иметь текст (текстовое содержание).

< foo lang='en'> < bar lang='fr'> PapayaWhip< /bar> < /foo>

Элементы которые не содержат текста и дочерних элементов называются пустыми.

< foo> < /foo>

Существует сокращённая запись пустого элемента. Поместив знак дроби / в конце открывающего тега, вы можете пропустить закрывающий тег. XML документ предыдущего примера с пустым элементов может быть записан следующим образом:

< foo/>

Подобно тому как функции Python могут быть объявлены в разных модулях, XML элементы могут быть объявлены в разных пространствах имён (namespaces). Пространства имён обычно выглядят как URL-пути. Для объявления пространства имён по умолчанию используется директива xmlns. Объявление пространства имён очень похоже на атрибут, но имеет специальное значение.

< feed xmlns='http: //www. w3. org/2005/Atom'> ① < title> dive into mark< /title>         ② < /feed>

① Элемент feed находится в пространстве имён http: //www. w3. org/2005/Atom.

② Элемент title также находится в пространстве имён http: //www. w3. org/2005/Atom. Пространство имён применяется как к элементу в котором оно было определено так и ко всем дочерним элементам.

Вы можете объявлять пространство имён xmlns: prefix и ставить ему в соответствие префикс prefix. Тогда каждый элемент в данном пространстве имён должен быть явно объявлен с указанием префикса prefix.

< atom: feed xmlns: atom='http: //www. w3. org/2005/Atom'> ① < atom: title> dive into mark< /atom: title>         ② < /atom: feed>

① Элемент feed находится в пространстве имён http: //www. w3. org/2005/Atom.

② Элемент title также находится в пространстве имён http: //www. w3. org/2005/Atom.

С точки зрения синтаксического анализатора XML, предыдущие два XML документа идентичны. Пара «пространство имён» + «имя элемента» задают XML идентичность. Префиксы используются только для ссылки на пространство имён, но не изменяют имени атрибута. Если пространства имён совпадают, имена элементов совпадают, атрибуты (или их отсутствие) совпадают и тексты элементов совпадают, то XML документы одинаковы.

И, наконец, XML документы могут содержать информацию о кодировке символов в первой строке до корневого элемента. (Если Вам интересно как документ может содержать информацию которая должна быть известна XML-анализатору до анализа XML документа, то смотрите Catch-22 раздел F XML спецификации)

<? xml version='1. 0' encoding='utf-8'? >

Теперь Вы знаете об XML достаточно чтобы «вынести» следующие разделы главы!

Структура формата синдикации фида Atom

Рассмотрим блог (weblog) или любой сайт с часто обновляемым контентом, например CNN. com. Сайт содержит заголовок («CNN. com»), подзаголовок («Breaking News, U. S., World, Weather, Entertainment & Video News»), дату последнего изменения («обновлено 12: 43 p. m. EDT, Sat May 16, 2009») и список статей опубликованных в разное время. Каждая статья в свою очередь также имеет заголовок, дату первой публикации (и, возможно, дату последнего обновления, в случае если статья была корректирована) и уникальный URL.

Формат синдикации Atom разработан с целью хранить информацию подобного рода стандартным образом. Мой блог и CNN. com абсолютно разные по дизайну, содержанию и посетителям сайты, но оба имеют сходную структуру. Оба сайта имеют заголовки и публикуют статьи.

На верхнем уровне фид Atom должен иметь корневой элемент по имени feed находящийся в пространстве имен http: //www. w3. org/2005/Atom.

< feed xmlns='http: //www. w3. org/2005/Atom' ① xml: lang='en'>                   ②

① http: //www. w3. org/2005/Atom - пространство имён Atom

② Каждый элемент может содержать атрибут xml: lang который определяет язык элемента и его дочерних элементов. В данном случае атрибут xml: lang объявленный в корневом элементе задаёт английский язык для всего фида.

Фид Atom содержит дополнительную информацию о себе в дочерних элементах корневого элемента:

< feed xmlns='http: //www. w3. org/2005/Atom' xml: lang='en'> < title> dive into mark< /title>                                         ① < subtitle> currently between addictions< /subtitle>                     ② < id> tag: diveintomark. org, 2001-07-29: /< /id>                            ③ < updated> 2009-03-27T21: 56: 07Z< /updated>                               ④ < link rel='alternate' type='text/html' href='http: //diveintomark. org/'/> ⑤

① Заголовок title содержит текст 'dive into mark'.

② Подзаголовок subtitle фида есть строка 'currently between addictions'.

③ Каждый фид должен иметь глобальный уникальный идентификатор. RFC 4151 содержит информацию как создавать такие идентификаторы.

④ Данный фид был обновлён последний раз 27 марта 2009 в 21: 56 GMT. Обычно элемент updated эквивалентен дате последнего изменения какой-либо из статей на сайте.

⑤ А вот здесь начинается самое интересное. Элемент ссылки link не имеет текстового содержания, но имеет три атрибута: rel, type и href. Значение атрибута rel говорит о том какого типа ссылка. rel='alternate' значит, что это альтернативная ссылка этого фида. Атрибут type='text/html' говорит, что это ссылка на HTML страницу. И, собственно, путь ссылки содержится в атрибуте href.

Теперь мы знаем, что представленный выше фид получен с сайта «dive into mark». Сайт доступен по адресу http: //diveintomark. org/ и последний раз был обновлён 27 марта 2009.

Хотя в некоторых XML документах порядок элементов может иметь значение, в фидах Atom порядок элементов - произвольный.

Продолжим дальше рассматривать строение фида: после метаинформации о фиде идёт список последних статей. Статья выглядит следующим образом:

< entry> < author>                                                             ① < name> Mark< /name> < uri> http: //diveintomark. org/< /uri> < /author> < title> Dive into history, 2009 edition< /title>                       ② < link rel='alternate' type='text/html'                              ③ href='http: //diveintomark. org/archives/2009/03/27/dive-into-history-2009-edition'/> < id> tag: diveintomark. org, 2009-03-27: /archives/20090327172042< /id>    ④ < updated> 2009-03-27T21: 56: 07Z< /updated>                              ⑤ < published> 2009-03-27T17: 20: 42Z< /published> < category scheme='http: //diveintomark. org' term='diveintopython'/>   ⑥ < category scheme='http: //diveintomark. org' term='docbook'/> < category scheme='http: //diveintomark. org' term='html'/> < summary type='html'> Putting an entire chapter on one page sounds   ⑦ bloated, but consider this & amp; mdash; my longest chapter so far would be 75 printed pages, and it loads in under 5 seconds& amp; hellip; On dialup. < /summary> < /entry>                                                               ⑧

① Элемент author сообщает о том, кто написал статью: некоторый парень по имени Марк (Mark), который валяет дурака на сайте http: //diveintomark. org/ (В данном случае ссылка на сайт автора совпадает с альтернативной ссылкой в метаинформации о фиде, но это не всегда правда, так как многие блоги имеют несколько авторов, у каждого из которых — свой сайт. )

② Элемент title содержит заголовок статьи «Dive into history, 2009 edition».

③ Как и с альтернативной ссылкой на фид, в элементе link находится адрес HTML версии данной статьи.

④ Элемент entry, подобно фидам, имеет уникальный идентификатор.

⑤ Элемент entry имеет две даты: дату первой публикации и дату последнего изменения.

⑥ Элементы entry могут иметь произвольное количество категорий category. Рассматриваемая статья попадёт в категории diveintopython, docbook и html.

⑦ Элемент summary даёт краткий обзор статьи. (Бывает также не представленный здесь элемент содержания content предназначенный для включения в фид полного текста статьи. ) Данный элемент summary содержит специфичный для фидов Atom атрибут type='html' указывающий что содержимое элемента есть текст в формате HTML. Это важно, так как HTML-объекты & mdash; и & hellip; присутствующие в элементе должны отображаться как «—» и «…», а не печататься «как есть».

⑧ И, наконец, закрывающий тег элемента entry говорит о конце метаданных для этой статьи.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...