В качестве затравки приведу несколько фишек в E4X
- XML-структуру можно писать прямо в JS-коде (это не вызовет синтаксической ошибки)
- E4X можно использовать как простой шаблонизатор (код, обрамленный в фигурные скобки, парсится JS-движком)
- Возможность расширять прототип объекта XMLList (что позволит еще удобнее работать с XML)
- Удобная выборка XML-элементов из дерева, подобная XPath (но всё-же уступающая ему)
Ближе к делу, или "примеры всему голова"
Создадим тренировочный объект E4X, который будет использоваться в дальнейших примерах:И это всё! Неожидали такого от JavaScript? :) Чтобы убедиться, что всё работает, мы можем вызвать метод sales.toXMLString() или sales.toString(), и получить текстовое представление нашего XML. Как я уже говорил ранее, внутри XML-структуры мы можем использовать placeholder-ы, что в итоге нам даст некое подобие шаблонизатора. Также отмечу, что для создания объекта E4X, можно воспользоваться конструктором XML, например: var xmldoc = XML('<root/>'); при этом ключевое слово new не обязательно.
Пример использования в качестве шаблонизатора:Выборка элементов XML-дерева
Итак, правило первое, наш созданный объект sales уже ссылается на корневой элемент, а не на корень (/), как некоторые могли подумать по аналогии с XPath. Таким образом, чтобы получить его аттрибут vendor, мы можем выполнить следующую строку кода: sales.@vendor. Как вы уже заметили, E4X делает синтаксис не совсем привычным, приведу сразу основные сокращения для выборки элементов:
Аттрибуты элементов:
sales.@vendor (или sales.attribute('vendor')), для поиска всех аттрибутов можно использовать звездочку (*),
например выполнение строки sales.item[0].@*.length() вернет цифру 3.
Элементы (непосредственные "дети" текущей ноды):
sales.item (или sales.elements('item') или sales['item']),
если вам нужно выбрать все элементы, включая текстовые ноды, то можно воспользоваться звездочкой (*), т.е sales.*
Потомки (все элементы, идущие "вглубь" текущей ноды):
sales..item (или sales.descendants('item'))
Добавление, удаление элементов и аттрибутов
С этим еще проще, чем можно было себе представить. Для удаления элементов или аттрибутов используется стандартное ключевое слово delete:Расширение прототипа XMLList
Класс XMLList доступен не только в режиме readonly, но его также можно расширять, но перед именем нового метода, при добавлении в прототип, необходимо опять же указывать пространство имен function. Для примера, напишем функцию wrapAll, которая будет оборачивать все элементы в результирующем списке.Дополнительные фишки E4X
1) E4X позволяет создавать промежуточные элементы "на лету". Рассмотрим код:
Баги в ECMAScript for XML
При попытке выборки всех элементов sales.item.(@marked) произойдет ошибка. Происходит она потому, что не все элементы item имеют аттрибут marked.Решение: sales.item.( function::attribute('marked').length() )
Применение
В связи со слабой поддержкой E4X браузерами, он редко где и кем используется в вебе. Но это не мешает вам использовать его в случае:- При написании расширения для Firefox
- Если вы используете в работе серверный JavaScript, который работает на одном из приведенных выше движков, поддерживающих E4X
- Если вы пишите на AS3 ;)
