Книга: JavaScript. Подробное руководство, 6-е издание

11.7. Е4Х: ECMAScript for XML

11.7. Е4Х: ECMAScript for XML

Расширение ECMAScript for XML, более известное как E4X, - это стандартное расширение[25] JavaScript, определяющее ряд мощных особенностей для обработки XML-документов. Расширение Е4Х поддерживается интерпретаторами Spider-monkey 1.5 и Rhino 1.6. Из-за того что оно не получило широкой поддержки у производителей броузеров, расширение Е4Х, вероятно, лучше относить к серверным технологиям, основанным на интерпретаторах Spidermonkey или Rhino.

Расширение Е4Х представляет XML-документ (или элементы и атрибуты XML-документа) как объект XML, и представляет фрагменты XML (несколько элементов XML, не имеющих общего родителя) в виде родственного объекта XMLList. В этом разделе мы познакомимся с несколькими способами создания и обработки объектов XML. Объекты XML - это совершенно новый тип объектов, для работы с которыми в Е4Х предусмотрен (как мы увидим) специальный синтаксис. Как известно, для всех стандартных объектов JavaScript, не являющихся функциями, оператор typeof возвращает строку «object». Объекты XML, подобно функциям, отличаются от обычных объектов JavaScript, и для них оператор typeof возвращает строку "xml". Важно понимать, что объекты XML никак не связаны с объектами DOM (Document Object Model - объектная модель документа), которые используются в клиентском JavaScript (глава 15). Стандарт Е4Х определяет дополнительные средства для преобразования XML-документов и элементов между представлениями Е4Х и DOM, но броузер Firefox не реализует их. Это еще одна причина, почему расширение Е4Х лучше относить к серверным технологиям.

Этот раздел представляет собой краткое учебное руководство по расширению Е4Х и не должен рассматриваться как полноценное его описание. В частности, объекты XML и XMLList имеют множество методов, которые вообще не будут упоминаться здесь. Их описание также отсутствует в справочном разделе. Тем из вас, у кого появится желание использовать расширение Е4Х, за более полной информацией необходимо обращаться к официальной спецификации.

Расширение Е4Х определяет совсем немного новых синтаксических конструкций. Самая заметная часть нового синтаксиса заключается в возможности использования разметки XML непосредственно в программном коде JavaScript и включения в него литералов XML, как показано ниже:

// Создать объект XML
var pt = <periodictable>
  <element іd="1"><name>Водород</name></еlеment>
  <element іd="2"><name>Гелий</name></еlement>
  <element><name>/Литий</name></element>
</periodictable>;
// Добавить новый элемент в таблицу
pt.element += <element іd="4"><name>Бериллий</name></element;

Синтаксис литералов XML в расширении Е4Х в качестве экранирующих символов использует угловые скобки, что позволяет помещать в разметку XML произвольные выражения на языке JavaScript. Ниже демонстрируется еще один способ создания точно такого же элемента XML, как в примере выше:

pt = <periodictable></periodictable>; // Создать пустую таблицу
var elements = ["Водород", "Гелий", "Литий"]; // Добавить элементы
// Создать теги XML, используя содержимое массива
for(var n = 0; n < elements.length; n++) {
  pt.element += <element>
}

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

pt.element += new XML('<element><name>Бop</name></element>');

При работе с фрагментами XML вместо конструктора XML() используется конструктор XMLList():
pt.element += new XMLList( <element><name>Углерод</namex/element>' +
  ' <elementxname>Азот</name></element>');

После создания XML-документа для доступа к его содержимому можно использовать интуитивно понятный синтаксис Е4Х:

var elements = pt.element; // Вернет список всех тегов <element>
var names = pt.element.name; // Список всех тегов <name>
var n = names[0]; // "Водород": содержимое тега <name> с номером 0.

Кроме того, расширение Е4Х добавляет новый синтаксис для работы с объектами XML. Оператор .. - это оператор доступа к вложенным элементам. Его можно использовать вместо привычного оператора . доступа к членам:

// Другой способ получить список всех тегов <name>
var names2 = pt..name;

Расширение E4X позволяет использовать даже оператор шаблона:

// Получить все вложенные теги <element>.
// Это еще один способ получить список всех тегов <пате>.
var names3 = pt.element.*;

Расширение E4X отличает имена атрибутов от имен тегов с помощью символа @ (этот синтаксис заимствован из языка XPath). Например, значение атрибута можно запросить, как показано ниже:

// Получить атомное число гелия
var atomicNumber = pt.element[1].@id;

Оператор шаблона для имен атрибутов имеет вид

// Список свех атрибутов всех тегов <element>
var atomicNums = pt.element.@*;

Расширение E4X включает даже мощные и удивительно выразительные синтаксические конструкции для фильтрации списков с помощью произвольных выражений-предикатов:

// Отфильтровать список всех элементов так, чтобы
// он включал только элементы с атрибутом id < 3
var lightElements = pt.element.(@id < 3);
// Отфильтровать список всех тегов <element> так, чтобы он включал только те.
// имена которых начинаются с символа "Б". Затем создать список тегов <пате>
// из оставшихся тегов <element>.
var bElementNames = pt.element.(name.charAt(0) == 'Б').name;

Цикл fог/each, с которым мы познакомились выше в этой главе (раздел 11.4.1), в расширении Е4Х дополнен возможностью итераций по спискам тегов и атрибутов XML. Напомню, что цикл for/each похож на цикл for/in, за исключением того, что вместо итераций по свойствам объекта он выполняет итерации по значениям свойств:

// Вывести названия всех элементов периодической таблицы
for each (var е in pt.element) {
  console.log(e.name);
}
// Вывести атомные числа элементов
for each (var n in pt.element.@*) console.log(n);

В расширении E4X выражения могут присутствовать слева от оператора присваивания. Это позволяет изменять существующие и добавлять новые теги и атрибуты:

// Изменить тег <element> для Водорода - добавить в него новый атрибут
// и новый дочерний элемент, чтобы он выглядел так:
//
// <element symbol="B">
// <name>Водород</name>
// <weight>1.00794</weight>
// </element>
//
pt.element[0].@symbol = "B";
pt.element[0].weight = 1.00794;

Так же легко можно удалять теги и атрибуты, используя стандартный оператор delete:

delete pt.element[0].©symbol; // удалить атрибут
delete pt..weight; // удалить все теги <weight>

Расширение E4X реализовано так, что позволяет выполнять большинство типичных операций с документами XML с помощью привычного синтаксиса языка. В Е4Х также имеются методы, которые можно вызывать относительно объектов XML. Например, метод insertChildBefore():
pt.insertChildBefore(pt.element[ 1],
<element><name>Дeйтepий</name></element>);

Расширение E4X полностью поддерживает пространства имен, а также включает синтаксические конструкции и функции для работы с пространствами имен XML:

// Объявить пространство имен по умолчанию с помощью инструкции
// "default xml namespace" statement:
default xml namespace = "http://www.w3.org/1999/xhtml";
// Следующий документ xhtml содержит несколько тегов svg:
d = <html>
  <body>
    Маленький красный квадрат:
    <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
      <rect x="0" y="0" width="10" height="10" fill="red"/>
    </svg>
  </body>
</html>
// Элемент body c uri его пространства имен и локальным именем
var tagname = d.body.name();
var bodyns = tagname.uri;
var localname = tagname.localName;
// Выборка элементов <svg> выполняется сложнее, потому что они не принадлежат
// пространству имен по умолчанию. Поэтому для выборки svg сначала нужно создать
// объект Namespace и затем использовать его
// оператор :: добавляет пространство имен в имя тега
var svg = new Namespace('http://www.w3.org/2000/svg');
var color = d..svg::rect.@fill // "red"

Оглавление книги


Генерация: 1.678. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз