Вопросы XML: По ту сторону DOMИсточник: IBM developerWorks Россия Дит Элза (Dethe Elza), Дэвид Мертц (David Mertz)
Объектная модель документа, Document Object Model (DOM) - это один из самых реализованных инструментов для работы с данными XML и HTML, но его потенциал редко используется полностью. Если вы воспользуетесь моделью DOM и сделаете ее проще в применении при помощи расширений, вы получите мощный инструмент для работы с XML-приложениями, в том числе, с динамическими web-приложениями. Очередной материал в рубрике представляет приглашенный ведущий колонки, мой друг и коллега, Дит Элза (Dethe Elza). У Дита большой опыт в разработке web-приложений, работающих с XML, поэтому я пригласил его, чтобы рассказать об XML-программировании с использованием DOM и ECMAScript. Следите за новостями колонки, чтобы не пропустить новых материалов Дита. -Дэвид Мертц (David Mertz) DOM - это один из стандартных API для работы с XML и HTML. Его часто критикуют за слишком расточительное использование памяти, медленную работу и/или за излишнее многословие. Однако для многих приложений это самый правильный выбор, и, безусловно, работать с DOM проще, чем с другим основным API для XML, SAX. DOM получает все большее применение в таких инструментах, как web-браузеры, SVG-браузеры, программы OpenOffice и многие другие. DOM хорош тем, что он сам является прекрасно реализованным стандартом, и кроме того, встроен в другие стандарты. Как стандарт, он всегда работает одинаково, независимо от используемого языка программирования (это может расцениваться и как достоинство, и как недостаток, но, по крайней мере, подразумевает стабильность). В настоящее время DOM встраивается во многие web-браузеры и является компонентом многих спецификаций, основанных на XML. Поскольку DOM и так уже является частью вашего инструментария и, вероятно, вы хотя бы время от времени им пользуетесь, возможно, самое время воспользоваться преимуществами, которые предлагает эта модель. После того, как вы некоторое время поработаете с DOM, у вас появятся некоторые шаблоны - действия, которые вы захотите использовать снова и снова. Ярлыки помогут вам обойти многословность DOM и создать понятный и изящный код. Ниже представлена коллекция советов и приемов, которыми я пользуюсь чаще всего, с примерами на JavaScript. Методы insertAfter и prependChildДля первого приема не нужно никаких приемов. В DOM есть два метода, которые добавляют дочерние узлы в узел-контейнер (обычно Листинг 1. Ошибочный способ вставки и предпосылки
После выполнения этого кода функция Листинг 2. Правильный способ вставки и предпосылки
Если вы новичок в DOM-программировании, стоит отметить, что хотя в том языке программирования, который вы выбрали, может быть несколько указателей на узел, в дереве DOM узел может размещаться только в одном месте. Поэтому при вставке узла в дерево в другом месте вам не придется сначала удалять узел из дерева, это будет выполнено автоматически. Это полезно в том случае, если вы захотите изменить порядок узлов -- вы можете просто вставить узел в новое место. С учетом этой возможности, если у вас есть два соседних узла (назовем их
или
Что еще можно делать с DOM?Поскольку существуют web-страницы, существует множество вариантов применения DOM. Если вы посетите сайты, посвященные процедурам-закладкам, "закладуркам" (bookmarklets) (см. раздел Ресурсы), вы можете обнаружить несколько небольших сценариев, которые воплощают альтернативное использование DOM для переформатирования страниц, извлечения ссылок, скрытия изображений или рекламных Flash-баннеров и много других вариантов. Но первое есть первое. Поскольку Internet Explorer не описывает постоянные интерфейса Листинг 3. Сценарий, позволяющий убедиться в том, что узел задан
В листинге 4 показано, как извлечь все текстовые узлы, содержащиеся в каком-либо узле:
ЯрлыкиРаспространенная претензия к DOM заключается в том, что он слишком многословен и требует вводить слишком много текста для описания простых моментов. Например, если вы хотите создать элемент Листинг 5. Создание элемента <div>, длинный вариант
Если вы часто создаете новые узлы этим способом, то сейчас убедитесь в том, что очень скоро такой способ написания программ устареет. Должен быть лучший способ -- и он есть. Существует утилита, которая поможет создавать элементы, задавать для них атрибуты, стили и добавлять текстовые дочерние узлы. Все аргументы за исключением Листинг 6. Ярлык функции elem()
Вооружившись этим ярлыком, вы можете создать элемент Листинг 7. Создание элемента <div> сокращенным способом
Если вы хотите создавать более сложные объекты DHTML на лету, то утилиты, подобные этой, могут существенно сэкономить время. Принцип такой: если вы собираетесь часто создавать какие-либо DOM-структуры, то создайте утилиты, которые будут делать это за вас. Это не только уменьшит количество набираемого кода, но также устранит повторные вырезки-вставки кода (а это основной источник ошибок) и сделает ваши намерения более очевидными при чтении кода впоследствии. Какой узел следующий?В DOM не всегда просто определить, какой узел является следующим в структуре документа. Вот некоторые утилиты, которые помогут вам перемещаться вперед и назад по узлам:
На прогулку с DOMВ некоторый момент вы, вероятно, захотите выполнить обход DOM, вызвать функцию в каждом узле или возвратить значение для каждого узла. По сути, всем известно, что стандарт DOM Level 2 включает расширение под названием DOM Traversal and Range, которое задает объекты и API для итерирования через узлы DOM, проходит DOM, чтобы применить функцию по всем узлам и выбирает диапазоны DOM. Поскольку эта функция не определяется в Internet Explorer (как минимум), для выполнения подобных функций можно использовать метод Идея этого метода - создать простые инструменты общего назначения, а затем комбинировать их различными способами, чтобы получить желаемые результаты. Если вы знакомы с функциональным программированием, то кое-что из описанного ниже покажется вам знакомым. Статья "Beyond JS library" (По ту сторону JS) продолжает развитие этой идеи. Листинг 9. Функциональные утилиты DOM
Листинг 9 содержит четыре базовых инструмента. Функции Листинг 10. Применение функциональных утилит.
Эти утилиты можно использовать для извлечения идентификаторов, изменения стилей, поиска определенных видов узлов, которые нужно удалить, и так далее. Поскольку API DOM Traversal и Range реализованы на многих платформах , их можно использовать для изменения дерева DOM без предварительного создания списка. Это очень эффективные инструменты, принцип работы которых аналогичен описанному выше. Опасные зоны DOMОбратите внимание на то, что ядро API DOM не предоставляет методов для синтаксического разбора данных XML в DOM или обратной сериализации модели DOM из XML. Эти методы описаны в расширении для DOM Level 3, "Load and Save", но это расширение не реализовано в достаточной степени, чтобы можно было на него рассчитывать. Каждая платформа (браузер или другое приложение, умеющее работать с DOM) имеет свои методы конверсии XML в DOM и из DOM, но в данной статье не рассматривается, как можно делать это на различных платформах. DOM не вполне надежный инструмент -- в частности, при помощи API DOM можно создать дерево, которое невозможно будет сериализовать в XML. Никогда не используйте в одной программе API DOM1, не поддерживающие пространства имен, и их аналоги из DOM2, которые поддерживают пространство имен, (например, Если вам приходится для выполнения синтаксического разбора полагаться на функции Отдельные символы Unicode не могут быть включены в XML. Реализация DOM позволяет сделать это, но результат будет несериализуемым. Он будет включать большинство управляющих символов и отдельные символы из пар для замены символов Unicode. Вы можете столкнуться с этим только в одном случае: если попытаетесь включить в документ двоичные данные, но это, возможно, другая проблемная ситуация. ЗаключениеВ статье рассматривается множество основных приемов, но DOM (и JavaScript) могут сделать для вас гораздо больше. Изучите материал, рассмотрите примеры и вы поймете, как можно применить эти принципы для решения проблем, которые иначе потребовали бы применения выполнения сценариев на стороне клиента, шаблонов или специальных API. У DOM есть ограничения и недостатки, но есть и много преимуществ: Эта модель встроена во многие приложения; работает независимо от того, какой технологией вы пользуетесь - Java, Python или JavaScript; более удобна, чем SAX; а благодаря манипуляциям, продемонстрированным выше, может быть элегантной и эффективной в применении.. Большая часть приложений в последнее время начинают поддерживать DOM, в том числе, приложения на основе Mozillа, OpenOffice и XMetaL от Blast Radius. Большинство спецификаций требуют наличия DOM и создают для этой модели расширения (такие, как SVG), поэтому в ближайшее время DOM не сойдет со сцены. Неплохо было бы познакомиться с этим используемым на многих платформах инструментом. |