На этом шаге мы рассмотрим использование XML-документов.
Название XML является частью аббревиатуры AJAX, но мы еще не рассматривали загрузку данных в формате XML. Эта возможность реализуется просто и очень похожа на методику работы с форматом JSON. Для начала нам потребуется XML-файл d.xml, содержащий некоторые данные, которые требуется отобразить:
<?xml version="1.0" encoding="win-1251"?> <entries> <entry term="DARKNESS, THE" part="Hard Rock"> <definition> The Darkness - английская хард-рок группа, образованная в английском городе Лоустофт в 2000 году. </definition> </entry> <entry term="DEAD CAN DANCE" part="Ethnic Fusion"> <definition> Dead Can Dance - австралийский музыкальный коллектив. </definition> </entry> <entry term="DEF LEPPARD" part="Hard'N'Heavy"> <definition> Def Leppard - британская рок-группа из Шеффилда, Йоркшир, Англия; образована в 1977 году. </definition> <quote author="http://ru.wikipedia.org/wiki/Def_Leppard"> <line>Их стилевая манера с годами претерпела ряд изменений, двигаясь от хард-рока к поп-року.</line> <line>Def Leppard дебютировали как NWOBHM-группа с альбомом On through the Night в 1980 году.</line> <line>Пик популярности этой группы пришёлся на 1984-89 годы, когда вышли их платиновые альбомы <Pyromania> и <Hysteria></line> </quote> </entry> <entry term="DEPECHE MODE" part="New Wave"> <definition> Depeche Mode - британский музыкальный коллектив, образовавшийся в 1980 году в городе Базилдон (графство Эссекс). </definition> </entry> <entry term="DEVO" part="New Wave"> <definition> Devo - американская рок-группа, образованная в Акроне, Огайо, в 1972 году и завоевавшая репутацию одной из самых изобретательных и новаторских в новой волне. </definition> </entry> <entry term="DINOSAUR JR." part="Alternative"> <definition> Dinosaur Jr. (первоначально - Dinosaur) - альтернативная рок-группа из США, основанная в 1984 г. </definition> </entry> <entry term="DOKKEN" part="Hard Rock"> <definition> Dokken - американская рок-группа, образованная в 1978 году в Лос-Анджелесе. </definition> <quote author="http://ru.wikipedia.org/wiki/Dokken"> <line>Музыка группы сочетала хард-рок с элементами хеви-метала.</line> <line>Часто музыку Dokken относят к стилю глэм-метала.</line> <line>По всему миру было продано более 10 миллионов альбомов группы.</line> <line>Состав Dokken часто менялся, неизменным участником оставался только основатель и вокалист группы Дон Доккен.</line> </quote> </entry> <entry term="DOOBIE BROTHERS, THE" part="Soft Rock"> <definition> The Doobie Brothers - американская музыкальная группа, которая начиная с 1970 года играла калифорнийский поп-рок в духе The Beach Boys. </definition> </entry> <entry term="DOORS" part="Classic Rock"> <definition> The Doors - американская рок-группа, созданная в 1965 году в Лос-Анджелесе, оказавшая сильное влияние на культуру и искусство 60-х годов. </definition> <quote> <line>Загадочные, мистические, иносказательные тексты песен и яркий образ вокалиста группы, Джима Моррисона, сделали ее едва ли не самой знаменитой и равно же противоречивой группой своего времени.</line> <line>Общий тираж альбомов группы превысил 80 млн экземпляров.</line> </quote> </entry> <entry term="DRACONIAN" part="Gothic Doom"> <definition> Draconian - шведская готик-дум-метал группа, играющая в духе My Dying Bride, Tristania и ранних Theatre of Tragedy. </definition> </entry> <entry term="DRAGONFORCE" part="Power"> <definition> DragonForce - рок-группа из Великобритании, играющая Power Metal. </definition> </entry> </entries>
Конечно, эти данные можно выразить множеством способов, и некоторые из них более близко имитируют структуру, выбранную для форматов HTML и JSON, использовавшихся выше. Однако здесь мы постарались продемонстрировать некоторые особенности XML, которые обеспечивают более высокую удобочитаемость этого формата для человека, например использование атрибутов для определения терминов и разделов вместо отдельных тегов.
Начало функции уже знакомо нам:
$(document).ready(function() { $('#letter-d a').click(function() { $.get('d.xml', function(data) { }); return false; }); });
На этот раз основную работу будет выполнять функция $.get(). Вообще говоря, эта функция просто извлекает файл из заданного адреса URL и передает функции обратного вызова простой текст. Однако если из ответа известно, что он имеет формат XML, благодаря тому, что сервер вместе с ответом возвращает его тип MIME, функция обратного вызова получит дерево DOM XML.
К счастью, как мы уже видели, библиотека jQuery обладает мощными средствами обхода дерева DOM. При обработке документов XML мы можем использовать обычные методы .find(), .filter() и другие методы обхода дерева, как если бы это был документ HTML:
$(document).ready(function() { $('#letter-d a').click(function() { $.get('d.xml', function(data) { $('#dictionary').empty(); $(data). find('entry').each( function() { var $entry = $(this); var html = '<div class="entry">'; html += '<h3 class="term">' + $entry.attr('term') + '</h3>'; html += '<div class="part">' + $entry.attr('part') + '</div>'; html += '<div class="definition">'; html += $entry.find('definition').text(); var $quote = $entry.find('quote'); if ($quote.length) { html += '<div class="quote">'; $quote.find('line').each( function() { html += '<div class="quote-line">' + $(this).text() + '</div>'; }); if ($quote.attr('author')) { html += '<div class="quote-author">' + $quote.attr('author') + '</div>'; } html += '</div>'; } html += '</div>'; html += '</div>'; $('#dictionary').append($(html)); }); }); return false; }); });
Рис.1. Вид страницы после загрузки данных в формате XML
Полный текст этого примера можно взять здесь.Улучшенный механизм селекторов, реализованный в jQuery, упрощает поиск элементов документа XML даже в самых сложных ситуациях. Например, предположим, что нам требуется отобразить только те статьи, в которых имеются цитаты, для которых в свою очередь указаны авторы. Для этого мы можем организовать выборку только тех статей, которые имеют вложенные элементы <quote>, заменив селектор entry на entry:has(quote). Затем можно добавить дополнительное ограничение и отобрать только те статьи, в которых элемент <quote> имеет атрибут author, указав селектор entry:has(quote[author]). Теперь строка с начальным селектором будет выглядеть так:
$(data). find('entry:has(quote[author])').each( function() {
Этот новый селектор соответствующим образом ограничивает перечень возвращаемых словарных статей, как показано на рисунке 2.
Рис.2. Вид страницы с ограниченным набором словарных статей
Полный текст этого примера можно взять здесь.Этот новый способ использования уже знакомых нам методов обхода дерева DOM подчеркивает гибкость поддержки селекторов CSS в библиотеке jQuery. Синтаксис стилей CSS обычно используется для улучшения оформления страниц HTML, поэтому для определения селекторов в стандартных файлах .css используются имена тегов HTML, такие как div или body, чтобы указать местоположение искомого содержимого. Однако при работе с библиотекой jQuery наравне со стандартными именами тегов HTML допускается использовать произвольные имена тегов XML, такие как entry и definition.
На следующем шаге мы рассмотрим выбор формата данных.