Шаг 96.
Библиотека jQuery.
AJAX. Загрузка документа XML

    На этом шаге мы рассмотрим использование 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;
   });
 });
Этот программный код воспроизводит требуемый эффект, когда выполняется щелчок на ссылке D, как показано на рисунке 1.

Рис.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.

    На следующем шаге мы рассмотрим выбор формата данных.




Предыдущий шаг Содержание Следующий шаг