Язык xml dom совместимые анализаторы


XML-анализаторы в java

XML как набор байт в памяти, запись в базе или текстовый файл представляет собой данные, которые еще предстоит обработать. То есть из набора строк необ­ходимо получить данные, пригодные для использования в программе. Поскольку ХML представляет собой универсальный формат для передачи данных, существуют универсальные средства его обработки – XML-анализаторы (парсеры).

Парсер – это библиотека (в языке Java: класс), которая читает XML-документ, а затем предоставляет набор методов для обработки информации этого документа.

Валидирующие и невалидирующие анализаторы

Как было выше упомянуто, существует два вида корректности XML-документа: синтаксическая (well-formed) – документ сформирован в соответствии с синтаксическими правилами построения, и действительная (valid) – документ синтаксически корректен и соответствует требованиям, заявленным в DTD.

Соответственно есть невалидирующие и валидирующие анализаторы. И те, и другие проверяют XML-документ на соответствие синтаксическим правилам. Но только валидирующие анализаторы знают, как проверить XML-документ на соответствие структуре, описанной в XSD или DTD.

Никакой связи между видом анализатора и видом XML-документа нет. Валидирующий анализатор может разобрать XML-документ, для которого нет DTD, и, наоборот, невалидирующий анализатор может разобрать XML-документ, для которого есть DTD. При этом он просто не будет учитывать описание структуры документа.

Древовидная и событийная модели

Существует три подхода (API) к обработке XML-документов:

· DOM (Document Object Model – объектная модель документов) –платформенно-независимый программный интерфейс, позволяющий программам и скриптам управлять содержимым документов HTML и XML, а также изменять их структуру и оформление. Модель DOM не накладывает ограничений на структуру документа. Любой документ известной структуры с помощью DOM может быть представлен в виде дерева узлов, каждый узел которого содержит элемент, атрибут, текстовый, графический или любой другой объект. Узлы связаны между собой отношениями родитель-потомок.

· SAX (Simple API for XML) базируется на модели последовательной одноразовой обработки и не создает внутренних деревьев. При прохождении по XML вызывает соответствующие методы у классов, реализующих интерфейсы, предоставляемые SAX-парсером.

· StAX (Streaming API for XML) не создает дерево объектов в памяти, но, в отличие от SAX-парсера, за переход от одной вершины XML к другой отвечает приложение, которое запускает разбор документа.

Анализаторы, которые строят древовидную модель, – это DOM-анализаторы. Анализаторы, которые генерируют события, – это SAX-анализаторы.

Анализаторы, которые ждут команды от приложения для перехода к следующему элементу XML – StAX-анализаторы.

В первом случае анализатор строит в памяти дерево объектов, соот­ветствующее XML-документу. Далее вся работа ведется именно с этим деревом.

Во втором случае анализатор работает следующим образом: когда проис­ходит анализ документа, анализатор вызывает методы, связанные с различными участками XML-файла, а программа, использующая анализатор, решает, как реагировать на тот или иной элемент XML-документа. Так, анна­лизатор будет генерировать событие о том, что он встретил начало документа либо его конец, начало элемента либо его конец, символьную информацию внут­ри элемента и т.д.

StAX работает как Iterator, который указывает на наличие элемента с помощью метода hasNext() и для перехода к следующей вершине использует метод next().

Когда следует использовать DOM-, а когда – SAX, StAX -анализаторы?

DOM-анализаторы следует использовать тогда, когда нужно знать структуру документа и может понадобиться изменять эту структуру либо использовать информацию из XML-файла несколько раз.

SAX/StAX-анализаторы используются тогда, когда нужно извлечь информацию о нескольких элементах из XML-файла либо когда информация из документа нужна только один раз.

Как уже отмечалось, SAX-анализатор не строит дерево элементов по содержимому XML-файла. Вместо этого анализатор читает файл и генерирует события, когда находит элементы, атрибуты или текст. На первый взгляд, такой подход менее естествен для приложения, использующего анализатор, так как он не строит дерево, а приложение само должно догадаться, какое дерево элементов описывается в XML-файле.

Однако нужно учитывать, для каких целей используются данные из XML-файла. Очевидно, что нет смысла строить дерево объектов, содержащее десятки тысячи элементов в памяти, если всё, что необходимо, – это просто посчитать точное количество элементов в файле.

XML DOM

Объектная модель документа (DOM) определяет стандартный способ доступа к элементам документа и манипулирования ими.

XML DOM

XML DOM определяет стандартный способ доступа к элементам XML документа и манипулирования ими.

XML DOM представляет XML документ в виде древовидной структуры.

При помощи дерева DOM можно получить доступ ко всем элементам документа. Можно изменять и удалять содержимое (текст и атрибуты) элементов, создавать новые элементы. Элементы, их текст и атрибуты формируют, так называемые, узлы DOM.

HTML DOM

HTML DOM определяет стандартный способ доступа к элементам HTML документа и манипулирования ими.

При помощи дерева HTML DOM можно получить доступ ко всем элементам HTML документа.

Загрузка XML файла

В следующем примере парсится XML документ в объект XML DOM, из которого затем при помощи Javascript извлекается некоторая информация:

Важное замечание!
Чтобы извлечь текст «Tove» из элемента XML файла, используется следующее выражение:

Обратите внимание, что даже если в XML файле присутствует только ОДИН элемент , все равно необходимо использовать индекс массива [0]. Это объясняется тем, что метод getElementsByTagName() возвращает массив.

Загрузка XML строки

В следующем примере парсится XML строка в объект XML DOM, из которого затем при помощи Javascript извлекается некоторая информация:

Пример XML в HTML

В следующем примере мы открываем XML файл и затем в цикле обходим каждый элемент CD и отображаем значения элементов ARTIST и TITLE в таблице HTML:

Описание данных с помощью XML

Если вы программируете на Java, за последние пару лет вам наверняка часто приходилось слышать об XML. Эта лекция поможет вам максимально быстро освоиться с технологией XML и с сопутствующей терминологией, так что вы вскоре сможете оценить все преимущества XML. Когда вы начнете разрабатывать приложения с использованием XML, разделы «Краткий справочник по правилам XML» и «Правила XML» данной лекции могут пригодиться вам в качестве справочного пособия по XML.

Расширяемый язык разметки (Extensible Markup Language, XML), созданный в 1996 году Консорциумом W3C (World Wide Web Consortium), является подклассом стандартного языка разметки (Standard Generalized Markup Language, SGML). XML был задуман как гибкий и в то же время формальный метаязык для использования в Интернете.

Метаязык (metalanguage) — это язык, предназначенный для описания других языков. Например, можно сказать, что словарь английского языка в совокупности с английской грамматикой образуют метаязык, описывающий английский язык.

Что касается языка XML, то назначение его — описывать языки разметки. В языке разметки (markup language) для структурирования данных используются теги. Язык гипертекстовой разметки (Hypertext Markup Language, HTML), наиболее распространенный на сегодняшний день язык разметки, исходно был написан на SGML, но мог бы быть и в какой-то степени был написан и на XML.

Язык HTML был задуман для решения специфических задач — разметки документов научной и академической направленности. Если вы занимались какой-либо деятельностью по разработке web-страниц, то хорошо знаете, что в настоящее время HTML «трещит по всем швам», так как на протяжении многих лет делаются попытки дополнить его так, чтобы он соответствовал всем запросам web-программистов. Многие называют XML заменой HTML, но это не совсем точное высказывание.

В то время как HTML содержит фиксированный набор тегов, в XML теги вообще отсутствуют. Вместо этого XML позволяет программисту самому создать такой язык разметки, который в точности соответствует требованиям конкретного приложения. В нашего курса мы проиллюстрируем процесс создания приложения, относящегося к области электронной коммерции. Язык разметки, который мы будем использовать, содержит теги, выглядящие осмысленно именно в этой области (такие, например, как

и ) [Price — цена, quantity — количество. — Примеч. перев. ].

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

сам файл XML, имеющий строго определенную структуру;

определение типа документа (Document Type Definition, DTD), где определяется структура файла XML (необязательный элемент);

таблицы стилей, содержащие информацию о том, как данные должны быть отформатированы при выводе (необязательный элемент);

процессор XML и различные служебные функции для манипулирования данными и переформатирования данных.

Для разработчиков web-приложений привычными являются рассуждения о том, что делают с текстом те или иные теги. Мы привыкли к тому, например, что тег выделяет соответствующий текст жирным шрифтом. Тем не менее фактически этот тег не имеет какого-либо собственного значения. Как будет отображен текст, помеченный тегом , полностью зависит от программы, анализирующей данные. В случае HTML такой программой обычно является web-браузер. Поскольку документы HTML создаются обычно в предположении, что их будут читать с помощью web-браузера, многие теги HTML указывают, как следует форматировать данные, но не содержат никакой информации для обычного человека. Назначение XML заключается как раз в том, чтобы отделить данные, содержащиеся в документе, от кода, который задает формат отображения этих данных. Это свойство XML позволяет извлекать данные из документа автоматически, то есть с помощью программных средств.

К примеру, предположим, что вы — торговый посредник и занимаетесь продажей электрических лампочек. На вашем web-сайте приводится самая свежая информация о ценах на товары от различных производителей. Вместо того чтобы вручную проверять web-сайты этих производителей и таким образом узнавать информацию о ценах, вы решаете написать программу, которая автоматически бы считывала цены, добавляла бы 10 % (надбавка для вас) и отображала бы информацию о товарах на вашем web-сайте. Пусть одним из ваших поставщиков является фирма ABC Lightening. В листинге 1.1 приводится часть кода HTML для таблицы, содержащей данные о товарах из web-сайта ABC Lightening [Авторы курса в листингах лекций 1 и 2 приводят вымышленные описания товаров, которые не следует воспринимать всерьез. — Примеч. перев. ].

Листинг 1.1. Код HTML для таблицы, содержащей информацию о товарах [Все представленные в курсе тексты программ можно найти на сайте издательства по адресу www.piter.com. — Примеч. ред. ]

Документ HTML только определяет, как должен быть отформатирован данный текст. Автоматическое извлечение информации из статической страницы HTML даже в лучшем случае окажется весьма непростой задачей. Если вы хотите написать программу, которая бы извлекала данные о цене из приведенного кода HTML, вы можете указать, что цена фонарика присутствует в третьем столбце таблицы в той строке, где в первом столбце стоит слово «фонарик». Но при этом вы рискуете тем, что ваша программа перестанет работать, если изменится дизайн web-сайта ABC Lightening или просто поменяется название данного товара.

Вполне вероятно, что некоторые фирмы-производители динамически создают свои web-сайты на основе информации из баз данных. В таком случае вы можете договориться с web-мастером каждого сайта об обмене информацией прямо из баз данных, но этот процесс требует времени и может происходить по- разному для каждой базы данных, из которой вам требуется получить информацию. Было бы гораздо проще, если сам документ был бы организован так, чтобы из него было легко извлекать содержательную информацию.

В листинге 1.2 приведен пример того, как та же информация может быть представлена с помощью XML [Catalog — каталог, product — товар, name — название, description — описание. — Примеч. перев ].

Листинг 1.2. Документ XML, содержащий информацию о товарах

Первая строка этого документа — объявление XML, которое содержит информацию, предназначенную для анализатора XML. Объявление XML (XML declaration) идентифицирует тип документа и версию XML, которая использовалась при создании документа. Эта строка не является обязательной, но, как правило, именно с нее начинается документ XML. Атрибут standalone = «no» означает, что данный документ снабжен DTD. Следующая строка — это объявление типа документа (document type declaration), которое указывает, какому DTD соответствует этот документ. В данном случае используется определение DTD, называемое catalog.dtd. Обратите внимание на то, что, хотя аббревиатуры совпадают, имеется большая разница между определением типа документа (сокращенно DTD — Document Type Definition) и объявлением типа документа. Объявление типа документа используется, чтобы указать, какому определению типа документа соответствует данный документ XML.

В объявлении типа документа также указывается корневой элемент документа. Корневой элемент (root element) — это элемент, который включает в себя все остальные элементы документа. В данном случае корневым является элемент ABC_Lightening:catalog. Часть имени элемента, расположенная перед двоеточием, идентифицирует пространство имен тега. Пространства имен не являются обязательными, но их можно использовать для того, чтобы гарантировать уникальность тегов. Если фирма ABC_Lightening начнет продавать товары других производителей, то пространства имен помогут избежать возможной путаницы, связанной с тем, что появятся элементы данных, внешние по отношению к этой фирме, с теми же названиями, но иначе структурированные.

Ниже показано, как может выглядеть определение catalog.dtd для гипотетического каталога товаров:

Это DTD показывает, какие элементы могут появиться в каталоге, а также определяет порядок их следования и число появлений. С использованием данных XML и DTD автоматическая идентификация и извлечение полезных данных из документа XML становятся довольно простым делом, в чем вы убедитесь, изучив этот курс.

WEB-РЕСУРСЫ XML

Следующие web-ресурсы содержат информацию о последних разработках в области XML, планах на будущее и инструментальных средствах, полезных при работе с XML:

xmlhack (www.xmlhack.com) — новости для web-разработчиков;

Enhydra (www.enhydra.org) — домашняя страница сервера Enhydra, посвященного приложениям Java/XML;

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

На стороне клиента XML позволяет достичь такого уровня соответствия конкретным условиям представления данных, которого очень трудно или невозможно достичь с использованием HTML. Например, для таких устройств, как PDA (Personal Digital Assistant — «карманный» компьютер, предназначенный для выполнения некоторых специальных функций) или мобильный телефон, требуется, чтобы страницы были отформатированы совсем не так, как для стандартных web-браузеров. Обычно, если даже имелась готовая страница, предназначенная для web-браузера, для подобных устройств приходилось полностью ее переделывать, то есть фактически создавать новую версию этой страницы. Однако благодаря структурированным данным документа XML, в котором содержательные данные отделены от форматирующих указаний, все, что вам надо сделать для приведения страницы в соответствие с каждым конкретным отображающем ее прибором, — это применить к имеющимся данным нужную таблицу стилей.

В наши дни XML оказывает очень большое влияние на организацию работы сервера. Один из способов применения XML на стороне сервера — передача сообщений (messaging), то есть обмен данными между приложениями или компьютерами. Чтобы приложения и компьютеры могли обмениваться информацией, для них должен быть определен единый формат сообщений. Представить себе то огромное влияние, которое XML может иметь в этой области, невозможно, не зная, хотя бы в общих чертах, истории передачи сообщений. Выбор стандарта для этого остается проблемой с тех времен, когда люди начали общаться между собой, но здесь я имею в виду только последние 30 лет.

Электронная коммерция, согласно определению европейского семинара, посвященного технической поддержке электронной коммерции (European Workshop on Open System’s Technical Guide on Electronic Commerce, EWOS TGEC 066), включает в себя такие разнообразные области, как маркетинг, поддержка логистики, проведение деловых операций и взаимодействие с административными органами (например, обмен данными по налогам и таможенным отчислениям). Механизм EDI (Electronic Data Interchange), предназначенный для обмена данными в электронной форме, начинает свою историю с 1970-х годов, когда он был впервые предложен Комитетом по координации передачи данных (Transportation Data Coordinating Committee, TDCC). В таких отраслях деятельности, как финансовая, где сетевые технологии начали применяться уже более тридцати лет назад, EDI служил в качестве стандартного формата обмена сообщениями. Недостаток систем EDI заключается в том, что их установка и поддержка обходятся дорого и, кроме того, они часто требуют выделенных линий.

В 1980-х годах началось бурное распространение и внедрение в фирмах систем электронной почты для рабочих групп. По мере того как производители пытались утвердить свои варианты таких систем в качестве стандарта, все больше фирм переходило на использование в своем бизнесе электронной почты. Такие пакеты, как Microsoft Mail и Lotus cc:Mail, позволяли небольшим компаниям обмениваться электронными сообщениями в пределах своей внутренней сети, но при попытке увеличить ее охват обычно начинались проблемы, управление сетью становилось все более трудной задачей. Также оказалось сложным объединить с внешним миром локальную сеть (Local Area Network, LAN). Результат, как и всегда в отношении компьютерных технологий, заключался в том, что передача сообщений становилась все более децентрализованной. По мере того как передача электронных сообщений отходила от первоначальной централизованной, строго контролируемой системы, требующей выделенных линий связи, в эту технологию вовлекалось все больше пользователей. Децентрализация привела также к огромным проблемам в отношении совместимости различных форматов, к дублированию разработок в области электронной коммуникации и к невозможности организованного ее развития.

Ко времени появления Интернета все уже очень хорошо понимали необходимость стандартизованного и в то же время гибкого способа организации передачи сообщений как между отдельными людьми, так и между компаниями, занимающимися электронной коммерцией. Широко доступный стандартный формат электронных сообщений имел бы огромное влияние на любой вид обмена информацией, как коммерческой, так и некоммерческой.

В первую очередь нужно было договориться о языке, и здесь XML оказался наиболее подходящим кандидатом. Основная причина, по которой XML прекрасно подходит для создания форматов передачи сообщений, — это его простота. XML подчиняется строго определенному стандарту, он не связан с какой-либо операционной системой или производителем, он совместим с большим количеством инструментальных средств и приложений, которые на протяжении многих лет разрабатывались для SGML. Требование строгого соответствия документов XML стандартам, установленным для правильно оформленных (well-formed) документов, гарантирует, что любой анализатор XML будет в состоянии прочесть и осмыслить любой документ XML. Кроме того, гораздо больше людей знакомы с языками разметки, чем с форматами сообщений, необходимыми для построения систем EDI. Благодаря XML формат сообщений может разработать любой, кто способен составить правильно оформленный документ XML.

Другой областью применения XML в web-документах является определение метасодержимого. Метасодержимое, или сведения о содержимом, позволяет сделать работу поисковых машин гораздо эффективнее. Например, пусть вам нужно найти сообщения о последних событиях в городе Остин (Austin) штата Техас. Тогда вы задаете поисковой машине следующие слова:

Поскольку большинство поисковых машин в настоящее время просто индексируют все содержимое сайта, имеется большая вероятность, что в результате такого поиска вам будет предложено множество не нужных вам документов, найденных по случайному совпадению. Если бы страницы, посвященные новостям из Остина, были написаны в виде структурированных документов XML, их поиск был бы гораздо более целенаправленным — вы могли бы указать, например, следующие параметры:

XML подходит и для создания баз данных. В документе XML используется древовидная структура хранения данных. Хотя по большому счету хранение данных в виде документов XML не слишком эффективно, у такого способа хранения есть свои преимущества. Как и в отношении передачи сообщений, самым большим преимуществом является простота. Древовидная структура — интуитивно понятный и знакомый способ организации данных. Кроме того, почти любой тип древовидной структуры — от реляционных баз данных до объектно-ориентированных баз данных и иерархических структур — может быть представлен с помощью дерева данных XML. Другое существенное преимущество использования XML для хранения данных заключается в том, что XML поддерживает набор символов Unicode. Следовательно, любой символ любого алфавита мира можно включить в документы XML на «законном основании».

Unicode — это официальный путь реализации универсального набора символов (Universal Character Set, UCS), определенного Международной организацией по стандартизации (International Standards Organization, ISO); иначе говоря, это универсальный стандарт кодировки символов для электронного представления текста и его компьютерной обработки. Для преобразования кодировок символов в фактический набор битов используются форматы преобразования UCS, или сокращенно — UTF (UCS Transformation Formats).

Спецификация XML требует, чтобы процессоры XML поддерживали два формата UTF: UTF-8 и UTF-16. В UTF-16 используются два байта для представления каждого символа. В UTF-8 для символов ASCII используется кодировка ASCII, занимающая один байт, а для символов, не входящих в ASCII, — кодировка переменной длины. Формат UTF-8 полезен, если вы хотите поддерживать совместимость с ASCII. Недостатком этого формата является то, что для представления остальных символов (не входящих в ASCII) в нем может потребоваться от 1 до 3 байтов. Если ваш текст в основном состоит из ASCII-символов, UTF-8 позволит вам сэкономить объем памяти. Если же вы используете другие символы, то этот формат, напротив, потребует излишних затрат. По умолчанию в XML применяют формат UTF-8. Кодировка документа определяется в объявлении XML с помощью специального атрибута кодировки (encoding), как показано в следующем примере:

В, настоящее время HTML-браузеры, как правило, делают попытки отобразить любой документ, даже содержащий ошибки или использующий очень старую версию HTML. С другой стороны, процессоры XML должны сообщать о неисправимой ошибке в случае, если они встречают ошибку в разметке. Неисправимая ошибка (fatal error) означает, что приложение не может выполняться далее, и выдает сообщение об ошибке. Такая строгая обработка ошибок иногда называется драконовской (draconian error-handling). Хотя этот способ обработки ошибок для тех, кто создает свои документы на HTML или на SGML, может показаться примитивным, в случае с XML он необходим, так как гарантирует, что любые XML-анализаторы будут воспринимать данный документ XML одинаково.

Документ XML, соответствующий правилам синтаксиса XML, называется правильно оформленным (well-formed). Авторы XML включили требование об этом в спецификацию XML, чтобы предотвратить для XML опасность стать жертвой так называемых «войн браузеров». Результатом таких «войн» между Microsoft и Netscape стало то, что теперь при создании HTML-документа авторам приходится постоянно заботиться о совместимости. Если бы такая история приключилась и с языком XML, он стал бы совершенно бесполезным.

Процессор XML (XML processor) — это программный модуль, который обеспечивает доступ приложений к данным, хранящимся в документах XML. Процессоры XML могут быть как проверяющими, так и не проверяющими допустимость (validating) документа. Проверяющий допустимость документа процессор определяет, существует ли для данного XML-документа DTD, и в случае положительного результата — соответствует ли структура документа правилам, указанным в DTD. Не проверяющий допустимость документа процессор должен удостовериться только в том, что документ соответствует правилам XML.

Весь текст XML-документа можно грубо разделить на две категории, символьные данные и разметку. К разметке (markup) относится все, что начинается с символа или начинается с символа & и заканчивается парой символов &;. Символьные данные (character data) — это все, что не является разметкой. Символьные данные можно подразделить еще на две категории: проверенные символьные данные (Parsed Character DATA, PCDATA) и непроверенные символьные данные (unparsed character data). Как следует из названия, данные PCDATA — это данные, проверенные анализатором XML.

В листинге 1.3 показан пример правильно оформленного документа XML [Beverage — напиток, manufacturer — производитель, nutntion_facts servmg_size= «1 can’ — содержание питательных веществ в одной бутылке, calories — калории, amount unit=»g» — количество в граммах, fat — жиры, sodium — натрий, carb — углеводы, protein — белки — Примеч перев ]:

Листинг 1.3. Правильно оформленный документ XML

В первую очередь в этом листинге следует отметить, что в объявлении XML присутствует атрибут standalone=»yes». Это означает, что в данном документе нет определения DTD. Наличие DTD в документах XML не является обязательным. Фактически приложения, в которых задействованы данные XML, часто не включают DTD в целях повышения эффективности в тех случаях, когда структура документа и возможность его многократного использования не являются важными факторами.

Следом за объявлением XML идут элементы. Элемент (element) — это наиболее распространенная форма разметки; он выделяется с помощью угловых скобок ( ) и описывает тот фрагмент данных, который заключен между скобками > и . , например). Имя элемента называется его общим идентификатором (Generic Identifier, GI) или типом (type). Текст между открывающим и закрывающим тегами называется содержимым (content) элемента. Например, типом следующего элемента является book (книга), а название книги (Java Developer’s Guide to XML) — его содержимым:

Элемент, лишенный содержимого, называется пустым элементом (empty element). Открывающий и закрывающий теги пустого элемента можно объединить в один тег, поместив в его конец косую черту:
. В XML также допускается запись пустого элемента с помощью открывающего и закрывающего тегов, например
.

Фактически существуют два типа пустых элементов: те, которые заранее определены как пустые и в принципе не могут иметь содержимого, и те, которые оказались пустыми случайно. Чтобы различить эти два типа элементов, рекомендуется использовать пару (открывающий тег, закрывающий тег) для тех элементов, которые не содержат данных, и один тег для тех элементов, которые определены как пустые.

Например, тег HTML
не может иметь содержимого, поэтому его нужно записывать как
Если же, к примеру, в вашем документе XML имеется экземпляр элемента, который в данный момент не имеет содержимого, но может получить его в дальнейшем, следует использовать стандартный синтаксис, то есть два тега [Cupboard — шкаф — Примеч перев ]:

У элементов могут быть атрибуты. Атрибут (attribute) — это пара имя-значение, расположенная в открывающем теге элемента. В следующем примере src, width и height являются атрибутами элемента img [Image — изображение, width — ширина, height — высота — Примеч перев ].

СОВЕТ

Если вы хотите, чтобы ваш код HTML был совместим с XML, то обратите внимание, что тег HTML переноса строки
способен причинить немало хлопот. Некоторые браузеры не воспринимают тег
, а пару тегов
воспринимают как два переноса строки. Для решения этой проблемы поместите пробел между символами br и косой чертой:
.

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

DTD, или определение типа документа, — это способ явным образом определить структуру класса документов XML Например, в DTD для перечня животных может быть задано, что для каждого животного нужно указать его имя, вид и характерный звук, который издает это животное DTD для этого перечня может выглядеть так [Animal-list — список животных, animal — животное, name — имя, type — вид, sound — звук. — Примеч перев]:

Илон Маск рекомендует:  Что такое код pfpro_cleanup

Если бы это определение DTD было стандартным зоологическим определением (фактически это не так), любой зоолог мог бы быть уверен, что его данные сможет прочесть любой другой зоолог и что для составления перечня животных все зоологи используют одни и те же правила Документ XML, который соответ- ствует правилам DTD, то есть какому-то конкретному определению, так же как и общим правилам XML, называется правильно оформленным и допустимым. Ниже показан пример правильно оформленного документа XML, который соответствует приведенному выше определению DTD:

ПРИМЕЧАНИЕ

Слова, набранные в предыдущих примерах только прописными буквами, являются ключевыми словами XML. Это делается не просто из стилистических соображений. Язык XML чувствителен к регистру, поэтому процессор XML выдаст сообщение об ошибке, если в ключевом слове окажется хоть одна строчная буква. Таким образом, в XML слова DOCTYPE и Doctype не более похожи между собой, чем слова DOCTYPE и EGGDROP.

Основным базовым типом объявления в DTD является объявление элемента, . Формат объявления элемента:

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

имена элементов не должны содержать символа ;

имя элемента должно начинаться с буквы или символа подчеркивания. После первой буквы в имени элемента может содержаться любое количество букв, цифр, дефисов, точек или символов подчеркивания;

имена элементов не могут начинаться с последовательности xml (в любой комбинации верхнего или нижнего регистров),

двоеточия запрещены, они применяются только в пространствах имен

В объявлении элемента вы указываете, что может появиться в качестве содержимого этого элемента Если вам нужно объявить элемент, который не должен содержать никаких данных, вы можете использовать тип EMPTY (например, ).

Хороший пример пустого элемента — элемент HTML img Чтобы этот элемент не нарушал принципа допустимости документа XML, нужно использовать синтаксис, определенный для пустого элемента XML:

Если вам нужно, чтобы в элементе были только данные PCDATA, используется следующее объявление:

Вы можете также указать, какие типы элементов могут появиться в элементе, в каком порядке и в каком количестве, как показано в следующем примере [My memoires — мои воспоминания, title — название, author — автор, philosophizing — философствования, sad_story — грустная история, funny_story — смешная история, lesson — наставление, conclusion — вывод — Примеч nepee ]:

В данном примере каждый из приведенных типов элементов должен появиться один раз (и только раз) внутри элемента mymemories в том порядке, в котором они перечислены в объявлении.

ПРИМЕЧАНИЕ

Элементы, которые появляются в элементе mymemoires, называются его дочерними элементами, а сам элемент mymemoires называется родительским. Каждый элемент может быть дочерним по отношению к любому количеству других элементов в документе. Элементы, разделенные более чем одним уровнем в иерархической системе, называются внуками, правнуками и т. д. (или соответственно дедами, прадедами — в другом направлении). Также можно при описании взаимоотношений между элементами использовать термины «предок» и «потомок».

Вы можете создать более гибкие правила, используя операторы повторяемости. Ниже показаны три оператора:

? — элемент должен встретиться один раз или не встретиться ни разу;

+ — элемент должен встретиться один или более раз;

* — элемент может встретиться любое количество раз или не встретиться вовсе.

Ниже снова приведено объявление элемента mymemoirs, переписанное с использованием операторов повторяемости:

Вы также можете указать, что некоторые элементы могут появиться как альтернатива другим элементам (то есть что между ними нужно делать выбор) с помощью вертикальной черты (|):

В этом объявлении элемент mymemoirs может содержать один или более элементов lesson или conclusion, но не оба одновременно. Еще более сложные правила можно создавать с использованием вложенных скобок. В листинге 1.4 показано, как может выглядеть определение mymeroirs.dtd [Paragraph — абзац, letter — письмо. — Примеч. перев. ].

Листинг 1.4. Полная версия определения mymeroirs.dtd

Наименее строгим является правило, которое можно выразить словами: «подходит что угодно». Если вы хотите указать, что в данном элементе могут появиться любые проверенные символьные данные или элементы, вы должны использовать ключевое слово ANY (любой), как показано в следующем примере:

ПРИМЕЧАНИЕ

Такое широкое правило, как элемент типа ANY, не вполне вписывается в строгую структуру XML. Вообще говоря, если вы создаете определение DTD, в котором используется ключевое слово ANY, вы, вероятно, делаете ошибку и вам следует поискать лучший способ определения.

Атрибуты используются для связывания пар имя-значение с элементами. Они определяются с помощью специальных объявлений атрибутов. Формат объявления атрибута в DTD следующий [Target_element — элемент, к которому относится данный атрибут, type — тип, default_value — значение по умолчанию. — Примеч. перев. ]:

Атрибуты используются, чтобы сообщить дополнительную информацию об элементах. Иногда бывает трудно решить, является ли некоторый фрагмент данных элементом или атрибутом. Например, два следующих фрагмента XML можно использовать для достижения одной цели:

Хотя выбор остается за вами, имеется несколько общих принципов. Мы расскажем о них в лекции 2, а сейчас вам просто следует запомнить, что этот выбор является непростой задачей для всех программирующих на XML.

Ниже приведены некоторые примеры объявлений атрибутов (несколько позже будет объяснено их значение) [Gender (male|female) — пол (мужской|женский), species — вид, «Cams familiaris» — «собака обыкновенная». — Примеч. перев.]:

Существует девять различных типов атрибутов, которые подразделяются на три категории: строковые (string), маркерные (tokenized) и перечислимые (enumerated). Строковые атрибуты определяются с помощью ключевого слова CDATA, которое указывается в качестве типа атрибута, как показано в следующем примере:

Значением этой строки может быть любая корректная строка символов.

Существует несколько типов маркерных атрибутов. Наиболее важными являются ID и IDREF. Атрибуты типа ID используются для однозначной идентификации элементов. Атрибут ID должен однозначно идентифицировать тот элемент, в котором он содержится. Например, в следующем объявлении задается обязательный атрибут ID, используемый для идентификации товара:

Атрибуты ID и IDREF можно использовать почти так же, как теги якоря А в HTML Значением атрибута IDREF должно быть значение атрибута ID какого-либо другого элемента (то есть они задают перекрестную ссылку). Например, в следующем фрагменте DTD объявляется элемент с атрибутом ID и элемент с атрибутом IDREF, который ссылается на первый элемент [Featured_products — ключевые товары, product_reference — ссылка на товар — Примеч перев]:

В файле XML, который использует это DTD, может содержаться фрагмент, подобный следующему:

В атрибутах перечислимых типов приводится список всех возможных значений этого атрибута. Например, если вы хотите объявить атрибут с именем angle_type для элемента, названного triangle, можно указать возможные значения следующим образом [Triangle — треугольник, angle_type — тип угла, obtuse|acute|nght — тупои|острыи|прямой — Примеч перев]:

Существует несколько ключевых слов, которые можно использовать, чтобы указать, должен ли этот атрибут обязательно содержаться в элементе и должен ли он принимать какое-то фиксированное значение. В следующей небольшой таблице приведены эти ключевые слова и указано их значение. Если вы не включите в объявление атрибута ни одно из этих ключевых слов, то по умолчанию будет подразумеваться слово IMPLIED

Этот атрибут должен присутствовать в каждом экземпляре элемента

Такой атрибут может не указываться в конкретных экземплярах элемента. Никакого значения для такого атрибута по умолчанию не предусматривается

Этот атрибут должен присутствовать в каждом экземпляре элемента и иметь указанное значение

Объявления сущностей позволяют использовать ссылки на сущность. Ссылка на сущность (entity) — это последовательность символов, которая автоматически подставляется вместо другой последовательности символов. Обычно ссылки на сущность требуются для того, чтобы обозначить символы, которые иначе могут быть приняты за символы разметки. Если вы имели дело с HTML, то, вероятно, сталкивались со ссылками на сущность. Наиболее распространенный тип сущности — это общая сущность (general entity), то есть сущность, которую можно подставить вместо символов в документах XML Формат объявления общей сущности следующий:

Ссылки на сущность имеют вид &имя_сущности; В XML имеется пять встроенных сущностей. Их не обязательно объявлять в DTD, хотя в спецификации XML это сделать рекомендуется, чтобы гарантировать возможность взаимодействия с HTML и SGML. Пять встроенных сущностей перечислены в приведенной ниже таблице:

Ссылка на сущность

Эти сущности можно объявить следующим образом:

ПРИМЕЧАНИЕ

Встроенные ссылки на сущности необходимы для создания документов XML, в которых любой из приведенных символов используется сам по себе, а не как фрагмент разметки Ссылки на общие сущности, которые вы определяете самостоятельно, удобны для присваивания имен последовательностям символов, которые вы часто используете. Например, чтобы объявить ссылку на сущность, представляющую символ торговой марки (™), можно включить следующее объявление:

Символ торговой марки можно затем вставить в любой документ XML, в котором имеется DTD с этим объявлением. Например:

Хотя сущности можно использовать в определениях других сущностей, при этом следует постоянно учитывать основной принцип: ссылки не должны быть циклическими.

Ниже приведен пример некорректного определения сущностей:

А это — корректное определение:

Объявление параметрических сущностей

Также можно объявлять ссылки на сущности, которые в DTD будут заменяться определениями сущности. Такой тип сущностей называется параметрическим. Ссылка на параметрическую сущность (parameter entity) начинается с символа * и не может присутствовать внутри документа XML — только в DTD, где она определяется. Ниже приведен пример использования параметрической сущности:

Объявление внешних сущностей

Внешние сущности (external entities) — это способ включить внешние файлы в документ XML. Они объявляются следующим образом:

После объявления внешней сущности вы можете включить содержимое указанного документа XML в ваш документ, используя ссылку на сущность — в данном случае &latest_prices.

Объявление непроверенных сущностей

Непроверенные сущности (unparsed entities) можно использовать для включения в документ XML данных в формате, отличном от XML. Для определения такой сущности используется ключевое слово NOATA. Например:

Непосредственно за ключевым словом NDATA следует ключевое слово нотации (notation data keyword). Это ключевое слово объявляется с помощью объявления нотации. Объявления нотации (notation declarations) предоставляют дополнительную информацию (например, для идентификации) или, как в данном случае, сведения о формате для непроверенных данных. Ключевое слово нотации определяется с помощью объявления . Например:

Проверенные символьные данные не могут содержать разметку. Следовательно, если вы хотите включить в содержимое элемента символы

Разделы символьных данных начинаются со строки . Кроме строки ]]>, содержимое раздела символьных данных не подвергается синтаксическому анализу. Если вы хотите включить пример кода XML в документ XML, вместо того чтобы заменять все символы & и It на &lt и &атр, можете включить весь блок, содержащий эти символы, в раздел символьных данных. Например:

Это пример правильно оформленного документа XML:

Комментарии (comments) в XML устроены и функционируют так же, как в


HTML, что видно из следующего примера:

Комментарии могут располагаться в любом месте документа, но не внутри разметки. Также комментарии не могут употребляться внутри объявлений. Комментарии не являются частью символьных данных и не могут использоваться анализатором XML.

В HTML комментарии часто используются в качестве контейнера текста, который не является частью документа, но доступен для программ. Например, команды CGI и JavaScript в документах HTML часто помещаются внутрь комментариев. Но анализаторы XML могут полностью игнорировать комментарии, поэтому в XML этим приемом не следует увлекаться, для этого имеются снециальные инструкции по обработке.

Мой опыт подсказывает, что попытка сэкономить время на комментариях обычно приводит к тому же эффекту, что перевод часов на летнее время. Так же как за сэкономленный час светлого времени приходиться расплачиватся, несколько дней приспосабливаясь к новому режиму, так и пренебрежение комментариями ради экономии времени впоследствии принесет вам массу проблем.

Инструкции по обработке (Processing Instructions, PI) используются для того, чтобы включить в документ информацию, предназначенную для приложений. Подобно комментариям, инструкции по обработке не считаются частью символьных данных документа. Но в отличие от комментариев, инструкции по обработке не игнорируются анализатором XML, а передаются приложениям.

Инструкции по обработке начинаются с символов . Первое слово в PI — это имя того приложения, для которого предназначается данная инструкция. Также можно использовать имя нотации, чтобы связать URI (Uniform Resource Identifier, универсальный идентификатор ресурса) с именем приложения. Следом за идентификационной информацией в PI может содержаться любой тип символьных данных. Ниже приведен пример PI:

Эта инструкция инициирует воспроизведение соответствующим приложением файла формата трЗ.

Хотя определения DTD в настоящее время являются стандартом определений типов документов XML, у них есть несколько серьезных ограничений. Определения DTD были унаследованы от языка SGML, где они были исходно разработаны для определения языков разметки, а не для создания схем баз данных. Самое существенное ограничение определения DTD заключается в том, что оно не обеспечивает достаточного контроля над содержимым элементов. Например, с помощью DTD невозможно указать, что показанный ниже элемент является допустимым [Today’s date — сегодняшняя дата — Примеч. перев. ]:

Точно так же нельзя указать, что следующий элемент не является допустимым:

Кроме того, вам может потребоваться задать более точные ограничения на количество появлений элемента в документе. С помощью DTD этого сделать не удастся.

В результате этих ограничений, а также из-за того, что XML все больше используется для хранения данных, были предложены некоторые альтернативные варианты. В настоящее время среди них лидирует язык определений схем XML (XML Schema Definition Language, XSD).

ПРИМЕЧАНИЕ

На момент написания данного курса XSD находится в стадии разработки. Это означает, что к моменту, когда этот язык получит официальный статус, в нем могут произойти значительные изменения по сравнению с нынешней версией. Со спецификацией XSD можно ознакомиться по адресу www.w3.org/XML/Schema.html.

Назначение схем XML то же, что и DTD: определение классов документов XML. Основная разница между ними заключается в том, что в схемах XML все элементы подразделяются на два типа: простые и сложные.

Элементы, которые содержат другие элементы или атрибуты наряду с символьными данными, относятся к типу сложных (complex), а те элементы, которые содержат только символьные данные, называются простыми (simple) элементами. Атрибуты всегда имеют простой тип. В листинге 1.5 показана схема XML для каталога товаров. В листинге 1.6 приведен документ XML, использующий эту схему [On sale date — дата начала продаж, quantity in stock — количество имеющегося в наличии товара. — Примеч. перев. ].

Листинг 1.5. Схема для каталога (catalog.xsd)

Элементы сложного типа определяются с помощью элемента compl exType. Как было уже сказано, элементы сложного типа содержат другие элементы и атрибуты. Элементы и атрибуты, содержащиеся внутри сложных элементов, определяются с помощью элементов element и attribute соответственно. Например, в листинге 1.5 элемент product определен как элемент сложного типа. Внутри определения типа ProductType определяются пять элементов: productName, quantity_in_stock, price, comment и partNum.

Элементы простого типа не имеют атрибутов и не содержат других элементов. В XSD имеется ряд встроенных простых типов, в том числе string, binary, boolean, double, float и т. д. На основе встроенных простых типов можно сконструировать дополнительные простые типы. В частности, в предыдущем примере определяется простой тип Sku, сконструированный на основании типа string.

Процесс конструирования новых простых типов из уже существующих называется ограничением (restriction). Обратите внимание, что в определении нового типа Sku используется регулярное выражение, задающее шаблон, которому должно соответствовать содержимое любого элемента или атрибута данного типа.

В схемах XSD имеются гораздо более гибкие операторы повторяемости, чем в DTD. Как говорилось выше, в DTD можно указать, что элемент должен встретиться ноль, один, один или более или любое количество раз. В дополнение к этим операторам схема XML позволяет задавать минимальное и максимальное количество повторов одного элемента в документе, его значение или диапазон значений и т. д.

Расширяемый язык таблиц стилей (Extensible Stylesheet Language, XSL), как следует из его названия, — это язык для конструирования таблиц стилей. Таблицы стилей XSL используются для описания внешнего вида документов XML, предназначенных для чтения людьми.

Например, web-дизайнер может создать таблицу стилей для XML-каталога товаров. В этой таблице стилей может быть указано, какие шрифты, размеры шрифтов и границ нужно использовать в документе, что фактически выполняется, когда сам документ объединяется с таблицей стилей с помощью процессора XSL.

Применение таблицы стилей к документу процессор таблиц стилей осуществляет в два этапа. Первый этап — трансформация дерева (tree transformation). Вы можете, например, написать таблицу стилей, которая расположит товары в вашем каталоге в алфавитном порядке или пронумерует их, прежде чем отобразить. Трансформация дерева позволяет также перемещать данные XML и выполнять вычисления с этими данными.

Второй этап — форматирование (formatting). Форматирование фактически представляет собой процесс задания стиля отображения данных, размеров шрифтов, разрывов страниц и т. п.

Спецификация XSL содержит три различных языка, предназначенных для осуществления этих двух задач:

XML Path Language (XPath) — язык для создания ссылок на различные части документа XML;

XSL Transformations (XSLT) — язык, предназначенный для генерации дерева документа;

Extensible Stylesheet Language (XSL) — XSLT плюс описание набора объектов форматирования и свойств форматирования.

Предположим, что у вас имеется документ XML, описывающий вашу музыкальную библиотеку, например такой, как представленный в листинге 1.7.

Листинг 1.7. Пример каталога музыкальной библиотеки (MyMusic.xml)

Допустим, вы хотите создать и напечатать список всего, что имеется в вашей библиотеке. Один из способов сделать это заключается в том, чтобы применить к документу MyMusic.xml таблицу стилей, которая трансформирует его в формат HTML. В листинге 1.8 приводится такая таблица стилей.

Листинг 1.8. Таблица стилей, генерирующая документ HTML (CDstyle.xsl)

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

Также вы можете использовать каскадные таблицы стилей (Cascading Style Sheets, CSS) для применения определенного формата к данным XML. В этом случае вы должны связать документ с таблицей стилей с помощью инструкции по обработке, подобной следующей:

В листинге 1.8 показан базовый пример трансформации данных XML с помощью стандартной таблицы стилей. XSLT находит данные, которые соответствуют некоторому образцу, и вставляет их в нужное место шаблона. Поиск соответствия с образцом — очень важная часть XSL. Посмотрим на образец, который применялся во второй части нашего примера:

Эта строка задает цикл по всем экземплярам элемента cd внутри элемента library. Если вы хотите создать разделенный запятыми список всех песен на каждом диске (каждому диску соответствует свой экземпляр элемента cd), вы можете задать еще один цикл внутри приведенного выше цикла, как показано в следующем примере:

Если получившийся документ XML открыть в браузере, поддерживающем XSL, то он будет выглядеть примерно так, как показано на рис. 1.1.

Рис. 1.1. Результат применения таблицы CDstyle.xsl к файлу MyMusic.xml

В данном курсе мы будем использовать базу данных XML, предназначенную для хранения каталога товаров, которыми торгует вымышленный электронный магазин. Хотя мы предполагаем, что доступ к данным XML непосредственно из приложений осуществляется достаточно быстро, все же для повышения эффективности можно импортировать XML-базу данных приложения в реляционную базу данных. В настоящее время все поставщики баз данных предлагают средства (или планируют сделать это), позволяющие передавать данные между реляционной базой данных и документами XML, и ряд других вспомогательных инструментальных средств. Данные можно извлекать из любой базы данных и преобразовывать в данные XML, которые используются в приложении, при этом не приходится модифицировать само приложение. Вероятно, в этом и заключается основное преимущество создания приложений, рассчитанных на данные XML: XML — это стандарт, в который могут быть преобразованы данные любого типа, следовательно, приложение гарантированно сможет работать в будущем с данными любого нового типа.

Теперь, когда вы убедились в том, что XML — это правильный выбор для создания каталогов, рассмотрим два различных подхода к написанию программ на Java, предназначенных для работы с XML.

Язык SGML был ориентирован на документ как на единое целое, поэтому нет ничего удивительного в том, что и в отношении XML сначала использовался подход, связанный с объектной моделью документа (Document Object Model, DOM). Любая обработка документа в соответствии с моделью DOM предполагает, что документ прошел синтаксический анализ и представлен в памяти в виде древовидной структуры, каждая часть которой одинаково доступна. Этот подход символически иллюстрирует рис. 1.2.

Рис. 1.2. Модель программирования DOM

Когда люди начали программировать в соответствии с моделью DOM, быстро выяснилось, что это не очень удобно — приходилось строить объектную модель всего документа, даже если нужно было отобрать всего лишь несколько элементов. Кроме того, этот способ требует больших ресурсов памяти, что может сделать его использование затруднительным, если не сказать невозможным. В результате возникла необходимость в разработке другого способа, который получил название SAX (Simplified API for XML — упрощенный интерфейс прикладного программирования для XML) И DOM, и SAX представляют собой, таким образом, интерфейсы прикладного программирования, которые были реализованы как на Java, так и на других языках.

Как показано на рис. 1.3, анализатор SAX осуществляет один проход по документу XML, сообщая о результатах анализа путем вызова различных методов из кода вашего приложения. В документации SAX есть термин событие (event): событие происходит, когда анализатор идентифицирует элемент в документе XML, поэтому указанные методы называются обработчиками событий (event handlers). Когда анализатор достигает конца документа, в памяти остается только то, что было сохранено вашим приложением.

Как было сказано ранее и как показано на рис. 1.2 и 1.3, использование DTD не является обязательным в XML.

Рис. 1.3. Модель программирования SAX

Для программирования сервлетов и JSP (JavaServer Pages) полезными могут оказаться обе модели, что демонстрируют приведенные ниже примеры. Сначала рассмотрим инструментальные средства Java для «первого уровня» DOM и для версии SAX 1.0. На момент написания курса версия SAX 2.O. и второй уровень DOM находились в разработке, но ко времени, когда курс будет опубликован, вероятно, эти новые версии уже будут доступны.

Окончательная версия API для работы с объектной моделью документа находится в пакете org.w3c.dom, одобренном Консорциумом W3C. Этот интерфейс API включает в себя определения интерфейсов и один класс исключений. Основная идея заключается в том, что документ XML преобразуется в документ DOM, состоящий из объектов Java, которые реализуют эти интерфейсы. Любая часть документа становится объектом, а связи между объектами отражают иерархическую структуру документа.

Анализ XML для создания DOM

С точки зрения программиста, нет ничего проще, чем создать документ DOM, поскольку вся работа фактически делается анализатором. Все, что должен сделать программист, — это создать входной поток, выбрать анализатор и отойти в сторону. В листинге 1.9 показан шаблон метода, который считывает данные из файла с помощью утилит из пакета com.sun.xml.parser и возвращает объект com.sun.xml.tree.XmlDocument Класс Xml Document реализует интерфейс Document, как указано в спецификации W3C.

Если вы используете утилиты других пакетов, то конкретные имена могут измениться, но общий принцип останется прежним. В этом конкретном примере используются классы интерфейса прикладных программ Java для анализа XML (Java API for XML Parsing, JAXP), предложенные компанией Sun, которые в настоящее время используются в ядре сервлетов (servlet engine) Tomcat.

За последние годы было создано множество различных анализаторов XML, но только небольшое их число полностью соответствует рекомендациям DOM W3C. Последние тесты на совместимость показали, что наиболее высокий рейтинг в этом отношении имеет анализатор Sun.

Листинг 1.9. Шаблон метода создания объекта XmlDocument

Имея в памяти объектную модель документа, вы можете манипулировать ею с помощью методов интерфейса DOM из пакета org.w3c.dom, а также с помощью дополнительных инструментальных средств.

Основные этапы обработки документа XML на основе SAX можно сформулировать следующим образом.

Создание одного или нескольких пользовательских классов для обработки событий анализатора SAX.

Создание объекта, который обеспечивает прием входного потока символов.

Создание анализатора на основе одного из пакетов инструментальных средств.

Присоединение классов, обрабатывающих события, к анализатору.

Присоединение входного потока к анализатору, начало анализа.

Обработка всех событий в пользовательских классах, которая позволяет записать нужные данные, отследить ошибки и т. д.

Как видно, обработка документов XML в модели SAX подчиняется совсем другой идеологии, чем в модели DOM. Выбор одного из этих двух подходов для конкретного приложения — самый важный выбор из тех, которые вам предстоит сделать. В табл. 1.1 приведены основные критерии, которые следует учитывать в данном вопросе.

Таблица 1.1. Сравнение программирования на основе DOM и SAX

Требования к ресурсам памяти

Могут оказаться довольно высокими

Пропорциональны количеству элементов, которые требуется сохранить в памяти

Скорость первой обработки Невысокая, так как анализируются все элементы Высокая, особенно если нужные элементы легко локализуются Скорость повторной обработки Сравнительно высокая, так как все элементы уже находятся в памяти Сравнительно невысокая, так как каждый поиск подразумевает новый проход анализатора по документу Допустимость модификации Очень высокая Ограничена необходимостью создания нового документа XML для каждого прохода анализатора

Этот раздел можно считать кратким справочником по самым основным правилам XML. Полную спецификацию XML можно найти по адресу www.w3c.org.

Каждый элемент должен иметь открывающий и закрывающий теги, за исключением пустых элементов, для которых предусмотрен специальный синтаксис пустого элемента.

Имя открывающего тега должно совпадать с именем закрывающего тега. Заметим, что язык XML чувствителен к регистру. Варианты:

  • неправильно: ;
  • правильно: .

Элементы должны быть правильно вложены друг в друга. Варианты:

  • неправильно. какой-нибудь текст ;
  • правильно: какой-нибудь текст .

Имена элементов не должны содержать символа и должны начинаться с буквы или символа подчеркивания

Имена элементов не могут начинаться с символов xml (в любой комбинации верхнего и нижнего регистров)

В именах элементов не должно содержаться двоеточия, за исключением пространств имен.

Атрибуты не должны появляться более одного раза в открывающем теге или в теге пустого элемента.

Значения атрибутов должны быть заключены в кавычки.

В значениях атрибутов не должны содержаться прямые или непрямые ссылки на внешние сущности.

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

Ниже мы приводим общие сведения об элементах XML, в том числе о синтаксических правилах, регламентирующих применение элементов и их объявление.

Язык xml dom совместимые анализаторы

Web-службы зависят от способности участников взаимодействовать друг с другом даже при использовании ими различных информационных систем. XML (Extensible Markup Language), язык разметки, делающий данные переносимыми, является ключевой технологией, предназначенной для обеспечения такой способности. Корпоративные пользователи увидели преимущества использования XML для интеграции данных как для совместного использования существующих данных между подразделениями, так и для использования их совместно с другими предприятиями. В результате XML все больше используется в корпоративных интегрированных приложениях, как в сильносвязанных, так и в слабосвязанных системах. Из-за такой способности к интеграции данных XML стал фундаментом Web-вычислений. Web-службы зависят также от способности предприятий использовать различные вычислительные платформы для взаимодействия друг с другом. Это требование делает платформу Java™, программы в которой являются переносимыми, естественным выбором для разработки Web-служб. Этот выбор стал еще более привлекательным после появления

Илон Маск рекомендует:  keygen в HTML

новых Java API для XML, что сделало более легким использование XML в языке программирования Java. Кроме переносимости кода и данных Web-службы должны быть масштабируемыми, безопасными и эффективными. Java™ 2 Platform, Enterprise Edition (J2EE™), специально разработана для удовлетворения этих потребностей. Она облегчает в действительности трудную часть разработки Web-служб, а именно программирование инфраструктуры. Эта инфраструктура включает в себя такие функции как безопасность, управление распределенными транзакциями и управление пулом соединений, которые имеют важнейшее значение для производительности Web-служб. А поскольку компоненты являются повторно используемыми, время разработки существенно уменьшается. Поскольку XML и платформа Java хорошо работают вместе, они стали играть центральную роль в Web-службах. Фактически, преимущества, предлагаемые Java API для XML и платформой J2EE, делают их идеальной комбинацией для размещения Web-служб. Эти API дают возможность сообществу Java, разработчикам и поставщикам сервисных программ и контейнеров начать разработку приложений Web-служб и использование стандартных Java API, составляющих основу принципа технологии Java — Write Once, Run Anywhere™ (пишется один раз, используется везде). Java Web Services Developer Pack (Java WSDP) собирает все эти API в один пакет. Примеры в Java WSDP должны запускаться в контейнере Tomcat (входящим в пакет Java WSDP).

Обзор стандартных анализаторов DOM и SAX

Java API for XML Processing (JAXP) предназначен для обработки XML-данных в приложениях, написанных на языке программирования Java. JAXP использует стандарты анализаторов SAX (Simple API for XML Parsing) и DOM (Document Object Model), так что вы можете выбирать между анализом данных как потока событий или построением их объектного представления. JAXP поддерживает также стандарт XSLT (XML Stylesheet Language Transformations), предоставляющий вам контроль над представлением данных и позволяющий преобразование данных в другие XML-документы или в другие форматы, такие как HTML. JAXP обеспечивает также поддержку пространства имен, позволяя вам работать с DTD, которые могли бы в противном случае вызвать конфликт имен.

JAXP позволяет вам использовать любой XML-совместимый анализатор в вашем приложении. Это обеспечивается при помощи так называемого уровня подключений, который разрешает подключать реализации SAX или DOM API. Уровень подключений позволяет также подключить XSL-процессор, дающий вам контроль над способом отображения ваших XML-данных.

«Simple API» for XML (SAX) представляет собой основанный на событиях механизм последовательного доступа, осуществляющий обработку «элемент-за-элементом». API этого уровня читает и записывает XML в хранилище данных или Web. Для серверных и высокопроизводительных приложений вы должны полностью понимать этот уровень. Но для многих приложений достаточно минимальных знаний.

DOM API обычно легче в использовании. Он обеспечивает относительно знакомую древовидную структуру объектов. Вы можете использовать DOM API для управления иерархией объектов приложения, которые он объединяет. DOM API является идеальным для интерактивных приложений, поскольку в памяти присутствует полная модель объектов, к ней можно получить доступ и пользователь может управлять ею.

Document Object Model (объектная модель документа) является искусственной древовидной структурой, в которой каждый узел содержит один из компонентов XML-структуры. Двумя наиболее общими типами узлов являются узлы элементов и текстовые узлы. Использование функций DOM позволяет вам создавать узлы, удалять узлы, изменять их содержимое и проходить по иерархии узлов.

С самого начала DOM разрабатывался нейтральным к языку. Поскольку он был предназначался для использования с языками, подобными С или Perl, DOM не использует преимуществ объектно-ориентированных особенностей Java.

С другой стороны, создание DOM требует чтения полной XML-структуры и хранения дерева объектов в памяти, то есть этот метод использует значительно больше ресурсов CPU и памяти. По этой причине SAX API более предпочтителен для серверных приложений и фильтров данных, которые не требуют наличия данных в памяти.

Однако SAX-протокол требует гораздо большего объема программирования, чем Document Object Model (DOM). Это управляемая событиями модель (вы обеспечиваете методы обратного вызова, а анализатор вызывает их по мере чтения XML-данных), которая затрудняет визуализацию данных. И, наконец, вы не можете вернуться к предыдущей части документа или реорганизовать его, точно также, как не можете вернуться к предыдущим данным в последовательном потоке данных, или реорганизовать символы, прочитанные из потока. По этим причинам разработчики, создающие ориентированное на пользователя приложение, которое отображает XML-документ и, возможно, модифицирует его, будут, вероятно, использовать DOM-механизм,

Когда необходимо изменить XML-структуру, особенно если это нужно сделать в интерактивном режиме, больший смысл имеет применение структуры, находящейся в памяти, такой как DOM. Однако, в то время как DOM предоставляет много мощных возможностей для больших документов (таких как книги и статьи), он также требует много сложного кодирования.

Так как данная курсовая работы представляет собой приложение для работы с небольшими объемами данных, но которые необходимо часто менять, то целесообразно использовать DOM-механизм работы с XML-файлами.

Программная обработка XML документов с помощью XML DOM

XML DOM определяет объекты и свойства всех XML элементов и методы ( интерфейс ) для доступа к ним. Иначе говоря, XML DOM описывает каким образом необходимо получать, изменять, добавлять и удалять XML элементы.

В соответствии с моделью DOM все, что содержится внутри XML документа — является узлом. То есть XML документ представляется в виде дерева узлов, которыми являются элементы, атрибуты и текст.

Поскольку структуры HTML и XML документов очень похожи, а HTML DOM и XML DOM являются частями более общего стандарта DOM , то и многие аспекты HTML DOM легко переносимы в XML DOM . Поэтому основное внимание будет уделено именно специфическим особенностям именно XML DOM . Рекомендуется предварительное ознакомление с «Введение в JavaScript. Программное взаимодействие с HTML документами на основе DOM API» .

Структурный анализ (парсинг) XML

Все современные браузеры имеют встроенные XML анализаторы (парсеры) для чтения и обработки XML . Анализатор считывает XML документ, размещает его в памяти и преобразует в XML DOM объект , доступный для языков программирования. Все примеры здесь приведены на JavaScript.

Имеются некоторые отличия между анализаторами в Microsoft и в других браузерах. Первый поддерживает как загрузку XML файлов, так и текстовых строк, содержащих XML код, в то время как в других браузерах используются раздельные анализаторы. При этом все анализаторы имеют функции для перемещения по дереву XML документа, доступа, вставки и удаления узлов в дереве.

Рассмотрим пример загрузки XML объектов (файлов и строк) с помощью XML анализатора Microsoft.

В первой строке программы создается пустой объект XML документа Microsoft. Далее для предотвращения работы сценария до полной загрузки документа флаг асинхронности устанавливается в » false «. В третьей строке содержится инструкция загрузить XML файл » timetable .xml «.

В следующем пример происходит загрузка строки с XML кодом для последующего анализа.

Следует обратить на разницу между методами load() и loadXML() по их назначению.

Ниже приведены также кроссплатформенные реализации загрузки XML файла и XML строки соответственно.

Программный интерфейс XML DOM

В рамках DOM модели XML можно рассматривать как множество узловых объектов. Доступ к ним осуществляется с помощью JavaScript или других языков программирования. Программный интерфейс DOM включает в себя набор стандартных свойств и методов.

Свойства представляют некоторые сущности (например, ), а методы — действия над ними (например, добавить ).

В XML DOM используются практически те же свойства и методы, что и в HTML DOM .

Например, результатом выполнения следующего ниже JavaScript кода будет текстовой содержимое элемента в файле timetable . xml . .

В рамках DOM XML возможны 3 способа доступа к узлам:

  1. С помощью метода getElementsByTagName(name) . При этом возвращаются все узлы с указанным именем тэга (в виде индексированного списка). Первый элемент в списке имеет нулевой индекс.
  2. Путем обхода узлов дерева с использованием циклических конструкций.
  3. Путем перемещения по дереву с использованием отношений между узлами.

Для определения длины списка узлов используется свойство length .

Birdstep XML. Реализация стандартов SAX, DOM и XPATH

Оглавление

XML является универсальным форматом для структурированных документов и данных в интернет. Этот язык разметки, являющийся стандартом консорциума W3C (World Wide Web Consortium), используется для создания структурированного содержания и сопровождения метаданных о нем. На практике это означает, что XML позволяет организациям совместно использовать, обмениваться и публиковать данные универсальным и общепринятым образом. Более подробную информацию о XML можно получить по адресу http://www.w3.org/XML/.

Язык XML повсеместно признан в качестве идеального средства для создания информационных сетей. В последнее время XML также рассматривается в качестве предпочтительного формата для обмена данными через беспроводные коммуникационные устройства. Язык XML, с его гибкостью и широким распространением, предлагает обобщенные средства расширения приложений, позволяя подключить мобильных пользователей как к потребительским, так и к бизнес-рынкам. Подготовленный к использованию XML процессор баз дынных Birdstep DataBase Engine , работающий в приложениях для портативных устройств, также хорошо будет работать и с периодически подключающимися пользователями.

Абстрактное определение языка XML называется множеством информации (Infoset) XML. Его целью является предоставление согласованного набора определений для ссылки на информацию в правильно построенном XML-документе.

Формальное определение Infoset можно найти по адресу www.w3.org/TR/xml-infoset.

Последовательное представление — это поток знаков, соответствующих определенным правилам синтаксиса XML. Это представление больше всего подходит для передачи данных, а также для их просмотра и чтения человеком.

Модель Infoset — это иерархия узлов, где каждый узел представляет информационный элемент, и где каждый элемент может содержать другие элементы или значения. Это представление больше всего подходит для навигации в структуре документа, для поиска конкретных элементов или значений, а также для генерации вторичных документов.

Представление Infoset языка XML не передает какого-либо особого синтаксиса сериализации.

На рисунке 1 показана структура сериализации, стоящая за иерархическим преставлением.

Перед тем, как XML-документ должен быть представлен в иерархической структуре на компьютере, он либо размещается в памяти, либо хранится в базе данных. Если необходимо постоянство, то, очевидно, что поддержка этой структуры базой данных экономит время и представляет более эффективное решение, чем многократный анализ документа в памяти. Реляционные базы данных не очень хорошо подходят для представления XML-документов. Они не поддерживают упорядоченность, иерархию, регулярные структуры и поля переменной длины. Реляционные базы данных были спроектированы для таких структур табличных данных, как базовая модель данных. Они предназначены для обработки SQL-запросов, но не очень хорошо подходят для обслуживания запросов, зависящих от содержания, в ориентированных на XML структурах.

Процессор Birdstep Database Engine был спроектирован с акцентом на эффективное представление XML-документов, на навигацию и поиск в них. В следующем параграфе описывается ключевой механизм, используемый в Birdstep Database Engine.

Наполненный данными процессор Birdstep Database Engine можно представить в виде коллекции объектов. Каждый объект может быть ассоциирован с типом (классом), который был декларирован в схеме базы данных. Объекты в Birdstep Database Engine могут быть организованы в иерархическую структуру. Поэтому этот процессор особенно хорошо подходит для представления XML-документов в виде иерархии узлов. Birdstep Database Engine содержит механизм создания структуры, навигации и поиска в ней. Ниже перечислены возможности доступные в Birdstep Database Engine.

  • Класс может обладать комбинацией обязательных и необязательных атрибутов.
  • Необязательные атрибуты могут быть добавлены динамически, что позволяет использовать представления структур данных, которые не были первоначально определены в схеме базы данных.
  • Объект может иметь много дочерних объектов, либо ни одного.
  • Дочерние объекты любого объекта упорядочены. Новые дочерние объекты вставляются согласованно по отношению к другим дочерним объектам.
  • Любой объект имеет не больше одного родительского объекта.
  • Ребро соединения объекта с родительским объектом обладает текстовым ярлыком, который описывает роль этого объекта по отношению к родителю.
  • Ярлыки могут быть скомбинированы, образуя пути в базе данных. Пути можно использовать для ограничения множества запросов на иерархически структурированные данные.
  • Объекты с одним и тем же родительским объектом могут иметь одинаковые ярлыки на ребре, соединяющем их с общим родителем. Это означает, что путь определяет не один, а множество объектов. С другой стороны, можно представлять ярлык как имя подкаталога. Тогда, на дочерние объекты, связанные с одним и тем же родительским объектом через одинаковый ярлык, можно смотреть, как на часть одного и того же подкаталога. Ярлык представляет подкаталог, а на объекты можно смотреть, как на файлы, хранимые в данном подкаталоге.
  • Диаграммы могут быть представлены с помощью комбинации родительски-дочерних структур и использования атрибутов для ссылки на другие объекты базы данных.
  • Индексирование обеспечивает быстрый поиск и навигацию.

Эти возможности Birdstep Database Engine служат средством для высокоэффективной и надежной реализации интерфейсов XML. XML-документы хранятся в базе данных Birdstep как объекты иерархической структуры. Для базы данных Birdstep БД-структура XML-документа была сконструирована максимально похожей на модель Infoset. Это означает, что существует однозначное соответствие между узлами в структуре Infoset и узлами в дереве, отвечающем объектам документов базы данных. Для эффективности, узлы атрибутов в Infoset не представляются как объекты в базе данных. Это отражается в структурном различии между определением в Infoset и XML-представлением в базе данных. Также для повышения эффективности, атрибуты Infoset представляются как атрибуты объектов, для которых атрибуты уместны. В последовательном (сериализованном) представлении XML-документы обычно содержат атрибуты, значения и теги. В базе данных Birdstep теги хранятся как объекты (теговые объекты). Атрибуты и их значения хранятся как атрибуты теговых объектов и в самих атрибутах этих объектов.

На рисунке 2 показано, как Birdstep реализует стандарты SAX, DOM и XPATH для программистов приложений с помощью множества классов и методов, определенных в этих стандартах. Реализация SAX, DOM и XPATH привязана к Birdstep Database Engine с помощью встроенного интерфейса API-обращений к базе данных.

Рис. 2. Реализация Birdstep DBE и XML

SAX является простым интерфейсом API для XML, который был разработан, чтобы обеспечить программистам доступ к нужной информации без необходимости самим создавать специальные синтаксические анализаторы.

SAX — это набор абстрактных программных интерфейсов, которые проецируют документ на поток вызовов известных методов. Продукты компании Birdstep используют внешние синтаксические анализаторы (expat-parser) с открытым кодом, чтобы анализировать поток и считывать интегрированные теги, атрибуты, значения, текст и структуру XML-документов. SAX компании Birdstep содержит методы для преобразования документа в иерархию объектов и атрибутов, которые будут представлять документ.

SAX описывает управляемый событиями интерфейс для процесса синтаксического разбора XML-документов. SAX является свободно распространяемым интерфейсом API, разработанным специалистами из списка рассылки XML-DEV. SAX не имеет формальных документов спецификации, но он определяется свободно распространяемой реализацией, выполненной с помощью языка программирования Java™. Синтаксический анализатор языка XML является совместимым с SAX, если он использует интерфейс, реализованный со статусом всеобщего достояния (public domain).

Управляемый событиями интерфейс обеспечивает механизм уведомлений для кода приложения при распознавании основным анализатором синтаксических XML-конструкций текущего документа.

SAX был выбран для того, чтобы обеспечить доступ к информации в XML-документе не как к дереву узлов, а как к последовательности событий. Реализация Birdstep SAX отслеживает SAX-события, генерируемые SAX-анализатором, когда он читает XML-документ. Birdstep SAX интерпретирует эти события для создания объектов в базе данных.

SAX будет реагировать на событие для каждого открытого и каждого закрытого тега. Еще он запускается на события для секций #PCDATA и CDATA, инструкций обработки, а также для шаблонов DTD, комментариев и так далее. На рисунке 3 показано, как можно использовать реализацию Birdstep SAX для импорта XML-документа в базу данных Birdstep.

Рис. 3. Реализация Birdstep SAX

Когда XML-документ сохранен в базе данных Birdstep, его можно получить целиком или по частям с помощью данной реализации SAX. В этом случае можно создавать программы приложений, которые используют интерфейс Birdstep SAX в качестве управляемого событиями механизма подачи элементов документа. Нужно отметить, что элементы подаются последовательно и навигация назад и вперед при использовании SAX невозможна. Конечно, программа приложения может реагировать на события независимо. Например, она может выполнять сериализацию документа, то есть перестраивать его. Также программа может осуществлять поиск тегов или сбор статистики. На рисунке 4 показано, как реализация Birdstep SAX взаимодействует с программой приложения и Birdstep Database Engine.

Рис. 4. Реализация Birdstep SAX

Так же, как анализатор XML вообще и SAX, в частности, наносит некоторый слой абстракции на фактическое текстовое представление XML-документа, объектная модель документа ( DOM ) добавляет слой абстракции к верхнему уровню всего документа. DOM стандартизует объектную модель, представляющую XML-документ, и определяет интерфейс структуры и стиля XML-документов, который не зависит от языка программирования и платформы, К этому интерфейсу некоторые процессы получают динамический доступ и могут обновлять его. Элементы рассматриваются как узлы дерева вместо того, чтобы быть составленными из открывающих и закрывающих тегов. Узлы могут обладать родительскими и дочерними объектами. Также они могут иметь внутренние свойства, которые можно изменить с помощью объектов и методов.

DOM предоставляет программам доступ к хранящейся в XML-документе информации, как к иерархической объектной модели. DOM рассматривает документ как дерево узлов, основанное на структуре и информации данного XML-документа. Программисты могут получить доступ к информации, взаимодействуя с этим деревом узлов. DOM определяет множество абстрактных интерфейсов, что моделирует согласование документа со спецификациями XML-модели Infoset. Реализация DOM компании Birdstep состоит из множества методов для обеспечения доступа к документу, хранимому в базе данных в виде иерархии объектов. Данная реализация DOM поддерживает приложения, написанные на C++.

Объектная модель документа задает древовидное представление XML-документа. Самый верхний уровень документа является корнем дерева и имеет единственный дочерний объект, который представляет собой элемент самого верхнего уровня. Этот элемент имеет дочерний узел, представляющий содержание и любые другие подчиненные элементы. Эти элементы могут иметь свои дочерние элементы на много уровней в глубину. Заданные функции позволяют проходить результирующее дерево любым желаемым образом, иметь доступ к элементам и значениям атрибутов, вставлять и удалять узлы, а также конвертировать данное дерево обратно в XML.

Использование DOM полезно для изменения XML-документов. Например, можно создать DOM-дерево, изменить его, добавив новые узлы и переместив некоторые ветви, а затем на выходе создать новый XML-документ. Также можно самостоятельно создать DOM-дерево и преобразовать его в XML. Часто, это более гибкий способ получения XML-кода, чем просто писать . в файле.

Для некоторых классов приложений использование SAX или прямое взаимодействие с анализатором XML может быть идеальным способом получения XML-документов. Если приложение должно обрабатывать XML-документы с минимально возможной задержкой или, если обрабатываемые документы слишком велики и не помещаются в памяти, тогда необходима обработка каждого из событий в той последовательности, в которой они возникают в документе

Проблема использования SAX заключается в том, что приложение должно установить обработчики событий для всех элементов, с которыми оно работает, и оперативно создавать свои собственные структуры данных по мере возникновения событий. Вместо того чтобы реагировать на каждое событие, было бы проще, если бы все дерево уже было загружено в память, так что при этом было бы возможно перемещаться по дереву и изменять его сегменты простым образом.

Модель DBE-хранилища компании Birdstep была спроектирована максимально приближенной DOM по структуре. Однако, эта модель проще, настолько, чтобы сделать эффективным последовательный вывод данных, то есть с помощью SAX. Поскольку в БД компании Birdstep XML-данные хранятся в структурах, схожих с DOM, DOM-интерфейс (или SAX-обработчик) не обязан загружать в память весь XML-документ прежде, чем пользователь сможет получить к нему доступ. К методам и объектам DOM можно обращаться в то время как документ находится в кэш-памяти буфера. Это основное отличие от подхода, когда XML-документ храниться в виде последовательной цепочки объектов.

XML-интерфейс процессора Birdstep Database Engine во многих отношениях подвержен влиянию со стороны DOM-интерфейса компании Apache, под названием Xerces. Это было сделано с целью помочь персоналу, знакомому с Xerces, легче перейти к работе с XML-интерфейсом процессора баз данных Birdstep Database Engine. Кроме того, проекты, использующие Xerces в качестве основного интерфейса, могут быть легко переведены на использование XML-интерфейса процессора Birdstep Database Engine. Однако, лежащая в основе архитектура полностью различна, поскольку DOM-интерфейс компании Birdstep работает с постоянными объектами баз данных, тогда как Xerces работает только с динамическими представлениями, находящимися в памяти.

XPATH (язык путей в XML) является языком для выбора в XML-документе некоторого множества узлов. Синтаксис этого языка основан на использовании путей. Продукт XPATH компании Birdstep содержит логику, которая интерпретирует запрос, преобразует его в серию обращений к API-методам Birdstep DBE и представляет результирующее множество узлов.

Основной целью XPath является адресация частей XML-документа. В поддержку этой основной цели данный язык также предоставляет базовые средства для манипуляций со строками, числами и логическими параметрами. В XPath реализован компактный, отличный от XML синтаксис для того, чтобы облегчить использование XPath с идентификаторами URI и значениями атрибутов в XML. XPath оперирует скорее с абстрактной, логической структурой XML-документа, чем с его поверхностным синтаксисом. Название XPath возникло из-за использования путевых обозначений, таких как указатель URL, для навигации по иерархической структуре XML-документов.

Основной синтаксической конструкцией в XPath является выражение. Выражение после обработки выдает объект одного из следующих четырех основных типов:

  • тип множества узлов (неупорядоченная коллекция узлов без дубликатов);
  • логический тип (значения: true или false);
  • число (число с плавающей запятой);
  • строка (последовательность UCS-символов).


XPath используется для извлечения путей из XML-документов. В базе данных компании Birdstep XML-документы представлены в виде иерархии объектов (узлов). Когда XPATH-оператор используется в программе, выражение и содержание узлов задаются в качестве параметров. Синтаксический анализатор XPATH оценивает выражение и преобразует его в запрос к процессору Birdstep Database Engine. Результатом запроса является неупорядоченное множество узлов, которые могут быть и пустыми. Это множество удовлетворяет критериям данного выражения.

Запрос обрабатывается с помощью функций LookUp процессора Birdstep Database Engine. Схема индексации процессора базы данных обеспечивает высокопроизводительный поиск. Получающееся множество представляется с помощью ориентированной на указатели коллекции в процессоре баз данных Birdstep Database Engines.

В чем разница между SAX и DOM?

Я прочитал несколько статей о сикверах XML и наткнулся на SAX и DOM.

SAX основан на событиях и DOM — это древовидная модель. Я не понимаю различий между этими понятиями.

Из того, что я понял, основанный на событиях означает, что какое-то событие происходит с node. Например, когда вы нажимаете на конкретный node, он будет давать все вспомогательные узлы, а не загружать все узлы одновременно. Но в случае синтаксического анализа DOM он загрузит все узлы и создаст древовидную модель.

Правильно ли я понимаю?

Пожалуйста, исправьте меня. Если я ошибаюсь или объясню мне основанную на событиях и древовидную модель проще.

Хорошо, вы близки.

В SAX события запускаются, когда XML анализируется. Когда синтаксический анализатор анализирует XML и встречает запуск тега (например, ), он запускает событие tagStarted (фактическое название события может отличаться). Аналогично, когда конец тега встречается во время разбора ( ), он запускает tagEnded . Использование анализатора SAX подразумевает, что вам необходимо обрабатывать эти события и понимать данные, возвращаемые с каждым событием.

В DOM во время разбора нет событий, инициированных. Весь XML анализируется и генерируется и возвращается дерево DOM (узлов в XML). После анализа пользователь может перемещаться по дереву для доступа к различным данным, ранее внедренным в различные узлы в XML.

В общем, DOM проще в использовании, но имеет накладные расходы на разбор всего XML, прежде чем вы сможете начать использовать его.

Всего несколько слов.

SAX ( S imple A PI для X ML): Является потоковым процессором. У вас есть только небольшая часть в памяти в любое время, и вы «обнюхиваете» поток XML, реализуя код обратного вызова для таких событий, как tagStarted() и т.д. Он почти не использует память, но вы не можете делать вещи «DOM», например, использовать xpath или траверсы.

DOM ( D ocument O bject M odel): Вы загружаете все это в память — это массивный всплеск памяти. Вы можете взорвать память даже документами среднего размера. Но вы можете использовать xpath и перемещаться по дереву и т.д.

Здесь в более простых словах:

DOM

Парсер дерева моделей (на основе объекта) (Дерево узлов).

DOM загружает файл в память и затем анализирует файл.

Имеет ограничения памяти, так как он загружает весь XML файл перед разбором.

DOM считывается и записывается (может вставлять или удалять узлы).

Если содержимое XML невелико, то предпочитайте парсер DOM.

Поиск назад и вперед возможен для поиска тегов и оценки информацию внутри тегов. Таким образом, это упрощает навигацию.

Медленнее во время выполнения.

SAX

Парсер, основанный на событиях (последовательность событий).

SAX анализирует файл по мере его чтения, т.е. анализирует node на node.

Нет ограничений памяти, так как он не хранит содержимое XML в памяти.

SAX доступен только для чтения, т.е. не может вставить или удалить node.

Используйте синтаксический анализатор SAX, когда объем содержимого большой.

SAX читает XML файл сверху вниз, а обратная навигация невозможна.

Быстрее во время выполнения.

Вы правильно понимаете модель DOM. XML файл будет загружен как целое, и все его содержимое будет построено как представление в виде дерева в представлении документа. Это зависит от времени и памяти, в зависимости от размера входного файла. Преимущество этого подхода заключается в том, что вы можете легко запросить любую часть документа и свободно манипулировать всеми узлами в дереве.

Подход DOM обычно используется для небольших структур XML (где мало зависит от того, сколько лошадиных сил и памяти у вашей платформы), которые, возможно, потребуется изменить и запросить по-разному после их загрузки.

SAX, с другой стороны, предназначен для обработки XML-данных практически любого размера. Вместо того, чтобы XML-инфраструктура делает для вас трудную работу по выяснению структуры документа и подготовке потенциально большого количества объектов для всех узлов, атрибутов и т.д., SAX полностью оставляет это для вас.

В основном это означает чтение ввода сверху и вызов методов обратного вызова, которые вы предоставляете при возникновении определенных «событий». Событие может попасть в открывающий тег, атрибут в теге, найти текст внутри элемента или встретить конечный тег.

SAX упрямо читает ввод и сообщает вам, что он видит таким образом. Вы должны поддерживать всю необходимую информацию штата. Обычно это означает, что вы создадите какую-то государственную машину.

Хотя этот подход к обработке XML намного более утомительный, он может быть очень сильным. Представьте, что вы хотите просто извлечь заголовки новостей из фида блога. Если вы прочитаете этот XML, используя DOM, он загрузит все содержимое статьи, все изображения и т.д., Которые содержатся в XML в память, даже если вас это даже не интересует.

С помощью SAX вы можете просто проверить, называется ли имя элемента (например, «title» ) при вызове метода «startTag». Если это так, вы знаете, что вам нужно добавить все, что предлагает следующее событие «elementText». Когда вы получаете вызов события «endTag», вы снова проверяете, является ли это закрывающим элементом «title» . После этого вы просто игнорируете все остальные элементы, пока не закончится вход или не появится другой «startTag» с названием «title» . И так далее.

Вы можете читать через мегабайты и мегабайты XML таким образом, просто извлекая крошечный объем данных, который вам нужен.

Отрицательная сторона этого подхода, конечно же, вам нужно делать гораздо больше бухгалтерского учета, в зависимости от того, какие данные вам нужно извлечь и насколько сложна структура XML. Кроме того, вы, естественно, не можете изменить структуру дерева XML, потому что вы никогда не имеете ее в руке в целом.

Таким образом, SAX подходит для расчёта через потенциально большие объемы данных, которые вы получаете с определенным «запросом», но не нуждается в модификации, в то время как DOM больше нацелен на то, чтобы предоставить вам полную гибкость в изменении структуры и содержимого, за счет более высокой потребности в ресурсах.

Вы сравниваете яблоки и груши. SAX — синтаксический анализатор, который анализирует сериализованные структуры DOM. Существует много разных парсеров, а «event-based» относится к методу синтаксического анализа.

Может быть, небольшая подсказка в порядке:

Объектная модель документа (DOM) представляет собой абстрактную модель данных, которая описывает иерархическую структуру данных на основе дерева; дерево документов состоит из узлов, а именно элементов, атрибутов и текстовых узлов (и некоторых других). Узлы имеют родителей, братьев и сестер и детей и могут быть пройдены и т.д., Весь материал, из которого вы привыкли делать JavaScript (что, кстати, не имеет ничего общего с DOM).

Структура DOM может быть сериализована, то есть записана в файл, используя язык разметки, такой как HTML или XML. Таким образом, HTML или XML файл содержит «выписанную» или «сплющенную» версию абстрактного дерева документов.

Чтобы компьютер мог обрабатывать или даже отображать дерево DOM из файла, он должен десериализовать или проанализировать файл и восстановить абстрактное дерево в памяти. Здесь происходит синтаксический анализ.

Теперь мы приходим к природе парсеров. Один из способов анализа состоит в том, чтобы прочитать весь документ и рекурсивно создать древовидную структуру в памяти и, наконец, разоблачить весь результат для пользователя. (Я полагаю, вы могли бы назвать эти парсеры «DOM parsers».) Это было бы очень удобно для пользователя (я думаю, что делает PHP-парсер PHP), но он страдает от проблем с масштабируемостью и становится очень дорогостоящим для больших документов.

С другой стороны, синтаксический анализ, основанный на событиях, как это делает SAX, смотрит на файл линейно и просто выполняет обратные вызовы пользователю всякий раз, когда он сталкивается с структурной частью данных, например «этот элемент запущен», «тот элемент закончился», «текст здесь» и т.д. Это имеет то преимущество, что оно может продолжаться вечно без учета размера входного файла, но оно намного более низкоуровневое, поскольку оно требует от пользователя выполнения всех фактических операций обработки (путем предоставления обратных вызовов). Чтобы вернуться к исходному вопросу, термин «основанный на событиях» относится к тем событиям синтаксического анализа, которые синтаксический анализатор поднимает при прохождении XML файла.

Статья Википедии содержит много подробностей о этапах анализа SAX.

Я предоставлю общий Q & A-ориентированный ответ для этого вопроса:

Ответ на вопросы

Нам нужен XML-парсер, потому что мы не хотим делать все в нашем приложении с нуля, и нам нужны некоторые «вспомогательные» программы или библиотеки, чтобы сделать что-то очень низкоуровневое, но очень необходимое для нас. Эти низкоуровневые, но необходимые вещи включают проверку корректности, проверку документа против его DTD или схемы (только для проверки парсеров), разрешение ссылки на символы, понимание разделов CDATA и т.д. Парсеры XML — это просто такие «вспомогательные» программы, и они будут выполнять все эти задания. С синтаксическим анализатором XML мы защищены от множества этих сложностей, и мы можем сосредоточиться только на программировании на высоком уровне через API, реализованный анализаторами, и, таким образом, повысить эффективность программирования.

Какой из них лучше, SAX или DOM?

Оба анализатора SAX и DOM имеют свои преимущества и недостатки. Какой из них лучше должен зависеть от характеристик вашего приложения (см. Некоторые вопросы ниже).

Какой парсер может получить лучшую скорость, DOM или SAX-парсеры?

Анализатор SAX может получить более высокую скорость.

В чем разница между API на основе дерева и API на основе событий?

API на основе дерева сосредоточен вокруг древовидной структуры и, следовательно, предоставляет интерфейсы для компонентов дерева (который является документом DOM), таких как интерфейс документа, интерфейс Node, интерфейс NodeList, интерфейс Element, интерфейс Attr и т.д. на. Напротив, однако, API на основе событий предоставляет интерфейсы для обработчиков. Существует четыре интерфейса обработчика, интерфейс ContentHandler, интерфейс DTDHandler, интерфейс EntityResolver и интерфейс ErrorHandler.

В чем разница между DOM Parser и SAX Parser?

Анализаторы DOM и анализаторы SAX работают по-разному:

Парсер DOM создает древовидную структуру в памяти из ввода документа, а затем ждет запросов от клиента. Но анализатор SAX не создает никакой внутренней структуры. Вместо этого требуется вхождения компонентов входного документа в качестве событий и сообщает клиент, что он читает, когда он читает входной документ. А

Парсер DOM всегда обслуживает клиентское приложение со всем независимо от того, сколько на самом деле требуется клиенту. Но Парсер SAX обслуживает клиентское приложение всегда только с кусками документ в любой момент времени.

  • С парсером DOM вызовы методов клиентское приложение должно быть явным и формировать своего рода цепочку. Но с SAX, некоторые определенные методы (обычно усредненные cient) будут вызывается автоматически (неявно) способом, который вызывается «обратный вызов», когда происходят определенные события. Эти методы не имеют которые будут называться клиентом явно, хотя мы могли бы назвать их в явном виде.
  • Как мы решаем, какой парсер хорош?

    В идеале хороший парсер должен быть быстрым (эффективный по времени), экономичным по площади, богатым функциональностью и простым в использовании. Но на самом деле ни один из основных парсеров не обладает всеми этими функциями одновременно. Например, DOM Parser обладает богатой функциональностью (поскольку он создает дерево DOM в памяти и позволяет вам неоднократно обращаться к любой части документа и позволяет изменять дерево DOM), но это пространство неэффективно, когда документ огромен, и требуется немного времени, чтобы научиться работать с ним. Тем не менее, SAX Parser гораздо эффективнее пространства в случае большого входного документа (поскольку он не создает внутренней структуры). Что еще, он работает быстрее и легче учится, чем DOM Parser, потому что его API очень прост. Но с точки зрения функциональности она предоставляет меньше функций, что означает, что сами пользователи должны позаботиться о большем количестве, например, о создании собственных структур данных. Кстати, что такое хороший парсер? Я думаю, что ответ действительно зависит от характеристик вашего приложения.

    Что такое приложения реального мира, где используется синтаксический анализатор SAX? выгоднее, чем использовать парсер DOM и наоборот? Каковы обычные приложение для анализатора DOM и анализатор SAX?

    В следующих случаях использование анализатора SAX выгодно, чем использование парсера DOM.

    • Входной документ слишком большой для доступной памяти (фактически в этом случае SAX — ваш единственный выбор)
    • Вы можете обрабатывать документ в небольших смежных фрагментах ввода. Перед тем, как сделать полезную работу, вам не нужен весь документ.
    • Вы просто хотите использовать парсер для извлечения интересующей информации, и все ваши вычисления будут полностью основаны на созданных вами структурах данных. Фактически в большинстве наших приложений мы создаем собственные структуры данных, которые обычно не так сложны, как дерево DOM. Из этого смысла, я думаю, вероятность использования парсера DOM меньше, чем использование синтаксического анализатора SAX.

    В следующих случаях использование анализатора DOM выгодно, чем использование анализатора SAX.

    • Ваше приложение должно одновременно получать доступ к отдельным частям документа.
    • Возможно, ваше приложение может использовать внутреннюю структуру данных, которая почти так же сложна, как и сам документ.
    • Ваше приложение должно несколько раз изменять документ.
    • Ваше приложение должно хранить документ в течение значительного времени через многие вызовы методов.

    Пример (используйте парсер DOM или парсер SAX?):

    Предположим, что у инструктора есть XML-документ, содержащий всю личную информацию студентов, а также точки, которые его ученики сделали в своем классе, и теперь он назначает окончательные оценки для студентов, использующих приложение. То, что он хочет произвести, — это список с SSN и оценками. Также мы предполагаем, что в своем приложении инструктор не использует структуру данных, такую ​​как массивы для хранения личной информации ученика и точек. Если инструктор решает дать А тем, кто получил средний класс или выше, и дать B другим, тогда ему лучше использовать парсер DOM в своем заявлении. Причина в том, что он не имеет никакого способа узнать, насколько средний класс до обработки всего документа. То, что он, вероятно, должен делать в своем приложении, сначала просматривает все точки учеников и вычисляет среднее значение, а затем снова просматривает документ и присваивает окончательный класс каждому ученику, сравнивая полученные очки с средним классом, Если, однако, инструктор принимает такую ​​политику классификации, что ученикам, получившим 90 баллов или более, назначаются A, а другим назначаются B, то, вероятно, лучше использовать SAX-парсер. Причина заключается в том, чтобы присвоить каждому учащемуся окончательный класс, ему не нужно ждать, пока весь документ будет обработан. Он сразу же может назначить оценку для ученика, когда парсер SAX будет читать оценку этого ученика. В приведенном выше анализе мы предположили, что инструктор не создал собственную структуру данных. Что делать, если он создает свою собственную структуру данных, такую ​​как массив строк для хранения SSN и массив целых чисел для проверки точек? В этом случае, я думаю, SAX — лучший выбор, прежде чем это могло бы сэкономить как память, так и время, но выполнить свою работу. Ну, еще одно соображение на этом примере. Что делать, если инструктор хочет сделать это, а не распечатать список, но сохранить исходный документ с оценкой каждого ученика? В этом случае анализатор DOM должен быть лучшим выбором независимо от того, какую политику классификации он принимает. Ему не нужно создавать какую-либо структуру данных. Ему нужно сначала изменить дерево DOM (т.е. Установить значение в «класс» node), а затем сохранить все модифицированное дерево. Если он предпочитает использовать синтаксический анализатор SAX вместо DOM-анализатора, тогда в этом случае он должен создать структуру данных, которая почти такая же сложная, как дерево DOM, прежде чем он сможет выполнить свою работу.

    Пример

    Описание проблемы: напишите программу Java, чтобы извлечь все информация о кругах, которые являются элементами в данном XML-документе. Мы предполагаем, что каждый элемент окружности имеет три дочерних элемента (т.е. Х, у и радиус), а также атрибут цвета. Образец документа дается ниже:

    Способы обработки XML

    Программная обработка XML: DOM vs SAX

    В этом разделе речь пойдет о двух основных подходах к обработке XML документов: DOM и SAX. DOM (Document Object Model) – это технология, основанная на формировании в оперативной памяти иерархических структур данных, соответствующих всему XML документу. DOM, как следует из самой аббревиатуры — это построение объектной модели документа (все элементы и их атрибуты представляются в памяти отдельными объектами), в то время, как SAX (Simple API for XML) — это анализ содержимого XML документа в процессе последовательного чтения данных файла. Другими словами, SAX — это простейший интерфейс обработки XML, не требующий дополнительных «накладных расходов». Эти два подхода не конкурируют между собой, а дополняют друг друга, поскольку их достоинства и недостатки практически не пересекаются.

    Сравнение технологий DOM и SAX

    Как я уже сказал, преимущества DOM, по всей видимости, являются недостатками SAX и наоборот, поэтому достаточно перечислить только преимущества каждого подхода.

    Преимущества XML DOM:

    Простота. Все узлы XML документа доступны сразу. Легко выполнять поиск узлов с использованием XPath.

    Можно добавлять, удалять, перемещать узлы, выполнять прочие операции редактирования, будучи уверенным, что результатом будет well-formed XML документ.

    Преимущества SAX:

    Экономия памяти. Анализаторы, работающие таким образом, как правило, не используют много памяти, поскольку не порождают в ней никаких лишних структур данных. Разработчик контролирует процесс разбора документа и анализирует его содержимое, обрабатывая события (обратные вызовы) анализатора. Параметрами этих событий являются имя текущего элемента, его тип, пространство имен и т.д.

    Эффективный и быстрый поиск нужных вам фрагментов, который достигается, опять же, за счет более эффективного использования памяти и вашего личного контроля над его окончанием.

    Рекомендации по выбору технологии обработки XML

    Когда нужно применять XML DOM:

    Вы используете XML для хранения кэша данных. Содержимое этого кэша может постоянно меняться в процессе выполнения программы.

    Объемы документов XML, с которыми вы имеете дело, невелики. Вам важна прозрачность и наглядность программного кода формирования XML документов. Скорость выполнения XPath запросов вас вполне устраивает.

    Вам необходимо сформировать отчет небольших размеров с последующей его XSL трансформацией в оперативной памяти.

    Вы используете XML, как некую прикладную структуру данных, например, для представления в памяти алгоритма работы вашего прикладного интерпретатора, кэша метаданных или любой другой сериализуемой структуры данных.

    Когда нужно применять SAX:

    • Вам необходимо прочитать все или осуществить поиск только нужных вам данных из весьма объемного XML документа. Редактировать документ не требуется. Представление XML в виде объектной модели слишком велико.

    Вам требуется преобразовать один большой XML документ в другой XML документ, но возможности XSL трансформации вас, по каким-либо причинам, не устраивают.

    Вам требуется перевести большие массивы данных произвольного формата в XML представление.

    P.S.
    Примеры кода, реализующие оба эти подхода обработки XML документов, вы можете найти здесь.

    Опубликовал +автор Октябрь 10 2011 13:34:46 11847 Прочтений
    Компьютерные курсы и курсы программирования

    Курс для начинающих программистов на C# и VB.NET.

    Построение SQL запросов и работа с базой данных.

    Программирование на C#. Краткое руководство.

    Применение регулярных выражений.

    Примеры программной Plug-in архитектуры.

    Язык разметки XML и его расширения с примерами.

    Языки HTML, XHTML и CSS с примерами разметки.

    Основы веб-дизайна: решения типовых задач верстки.

    Руководство по программированию на PHP для начинающих.

    Шаблоны проектирования
    Каталог шаблонов проектирования программных компонентов.

    Рефакторинг кода
    Каталог приемов рефакторинга программного кода.

    Е ditor С ontacts

    Имя: Джонатан Эйнджел

    Должность: старший редактор

    Издание : Network Magazine

    Улица и дом: Гариссона, 600

    Во фрагменте, записанном в HTML, теги размещают данные на экране программы просмотра (левая колонка). В случае использования языка XML фрагмент оказывается более масштабным. Однако он несет в себе информацию о содержании и нахождении полей данных.

    В XML теги не могут накладываться, как в HTML (что не поощряется, но допускается большинством программ просмотра HTML). Однако они могут быть вложены друг в друга. На самом деле, вложение даже поощряется как способ создания иерархии данных (подчиненные или равноправные отношения). Как видно из приведенной таблицы, такие элементы, как и , содержат данные, в то время как другие () присутствуют только в целях структурирования.

    Теги начала и конца элемента являются основными используемыми в XML разметками, но ими дело не исчерпывается. Например, элементам могут быть присвоены определенные атрибуты. Эта возможность аналогична имеющейся в HTML, где, например, элементу

    Справочные материалы
    может быть присвоен атрибут align=”center”. В XML элемент может иметь один или более связанных с ним атрибутов. Причем при составлении документа можно предложить их столько, сколько потребует логика представления публикации, например,

    Язык XML может использоваться в качестве промежуточного программного обеспечения. Если теги и элементы XML используются на персональном Web — сервере, то не имеет значения, какие имена присвоены элементам и тегам публикации. С другой стороны, при таком подходе возникает проблема программно – информационной совместимости с другими Web – серверами. Причем, это обстоятельство имеет огромное значение. Поэтому необходима стандартизация атрибутов тегов и элементов документа.

    Типы документов. Для этих целей используются определения типов документов (Document Type Definition, DTD). Хранимые в начале файла XML или в виде файла *.DTD, эти определения описывают информационную структуру документа. DTD перечисляют возможные имена элементов, определяют имеющиеся атрибуты для каждого типа элементов и описывают сочетаемость одних элементов с другими.

    Каждая строка в определении типа документа может содержать декларацию типа элемента, именовать элемент и определять тип данных, которые элемент может содержать. Она имеет следующий вид

    Например, декларация определяет элемент с именем publication, содержащий символьные данные (т. е. текст). Декларация определяет элемент с именем special_report, содержащий подэлементы article_1, article_2 и article_3 в указанном порядке, например:

    системами с помощью XML

    После определения элементов DTD могут также определять атрибуты с помощью команды !ATTLIST. Она указывает элемент, именует связанный с ним атрибут и затем описывает его допустимые значения. Например, следующая команда устанавливает соответствие между атрибутом manufacturer и элементом car, причем первый из них может принимать одно из указанных значений:

    (Audi л Volvo л Volkswagen)>

    !ATTLIST позволяет управлять атрибутами и многими другими способами: задавать значения по умолчанию, подавлять пробелы и т. д. DTD могут также содержать декларации !ENTITY, где определяются ссылки на объекты, а также декларации !NOTATION, указывающие, какие операции проводятся с двоичными файлами не в формате XML.

    Ограничение DTD состоит в том, что они не допускают типизации данных, т. е. ограничивают данные конкретным форматом (таким, как дата, целое число или число с плавающей точкой). Т.е. DTD используют иной синтаксис, нежели XML, и не всегда интуитивно понятны. Сегодня ведется работа по созданию более мощных и простых в использовании схем XML.

    К документам XML могут быть применены термины «правильно составленный» (well-formed) и «действительный» (valid). Документ XML считается правильно составленным, если для каждого открывающего тега имеется соответствующий закрывающий тег, а накладывающиеся теги отсутствуют. Документ является действительным, если он содержит DTD и соответствует его правилам.

    Значительный потенциал XML в качестве промежуточного программного обеспечения подкрепляется объектной моделью документа (Document Object Model, DOM), первая версия которого была принята в качестве рекомендации W3C в октябре 1998 года. DOM возникла как спецификация для обеспечения переносимости сценариев JavaScript и программ на Java между Web — браузерами и позднее эволюционировала в API для документов HTML и XML. Она определяет логическую структуру документов, способы доступа и манипулирования ими. Программисты могут создавать документы, управлять их структурой и добавлять, модифицировать или удалять элементы и содержимое.

    DOM не оказывает никакого влияния на то, как следует писать документы XML и HTML. Вместо определения набора структур данных она представляет документы в соответствии с объектной моделью, такой, как древовидная структура, состоящая из узлов. Нет никакой необходимости использовать DOM просто для просмотра документов XML из браузера. Она применяется, когда по сценарию требуется изменить документ XML или обратиться к его данным. На сервере DOM может применяться для анализа поступивших от клиента файлов XML и соответствующей реакции на них. Кроме того, программистами DOM может использоваться в качестве промежуточного уровня для преобразования из формата базы данных в XML. При правильной реализации интерфейсов DOM пользователям не потребуется знать, что данные хранятся в каком-либо ином формате, а не в XML.

    Таким образом, для разметки XML документа с помощью тегов, необходимо установить правила, понятные для языка разметки, а именно: описать, что является разметкой; точно определить, что означает тот или иной элемент разметки; описать подробно каждый из элементов (элемент — теги в совокупности с их содержанием); порядок их следования; а так же указать атрибуты, их характеризующие.

    На рис. 1 приведена потенциальная структура элемента.

    Рис. 1 Структура элемента XML .

    Таблицы стилей. Таблицы стилей — это набор правил, устанавливающих общий вид документа. Эти таблицы придают документам ясность; позволяют уменьшить время загрузки, трафик сети и нагрузку на сервер; в случае необходимости могут представить один и тот же источник информации различными способами; позволяют изменять вид одного или нескольких файлов, которые содержат правила о том, как должны выглядеть документы.

    Известно несколько языков описания таблиц стилей:

    — Каскадные таблицы стилей CSS ( Cascade Style Sheets ). При наличии нескольких таблиц стилей, из них обычно формируется каскад, т. е. иерархия со свойствами, взятыми из всех таблиц.

    — Расширяемый язык таблиц стилей XSL ( Extensible Style Sheets ). Этот язык разрешает пользователю создавать свои собственные форматирующие теги и свойства.

    — Язык семантики и спецификаций стиля документа DSSSL (Document Semantic and Style Specification Language).

    — XS , так же известный как DSSSL -0.

    Наибольший интерес представляют CSS и XSL . Ниже, в таблице 2 приведены известные в литературе сравнительные характеристики вышеуказанных таблиц стилей.

    Язык xml dom совместимые анализаторы

    Web-службы зависят от способности участников взаимодействовать друг с другом даже при использовании ими различных информационных систем. XML (Extensible Markup Language), язык разметки, делающий данные переносимыми, является ключевой технологией, предназначенной для обеспечения такой способности. Корпоративные пользователи увидели преимущества использования XML для интеграции данных как для совместного использования существующих данных между подразделениями, так и для использования их совместно с другими предприятиями. В результате XML все больше используется в корпоративных интегрированных приложениях, как в сильносвязанных, так и в слабосвязанных системах. Из-за такой способности к интеграции данных XML стал фундаментом Web-вычислений. Web-службы зависят также от способности предприятий использовать различные вычислительные платформы для взаимодействия друг с другом. Это требование делает платформу Java™, программы в которой являются переносимыми, естественным выбором для разработки Web-служб. Этот выбор стал еще более привлекательным после появления

    новых Java API для XML, что сделало более легким использование XML в языке программирования Java. Кроме переносимости кода и данных Web-службы должны быть масштабируемыми, безопасными и эффективными. Java™ 2 Platform, Enterprise Edition (J2EE™), специально разработана для удовлетворения этих потребностей. Она облегчает в действительности трудную часть разработки Web-служб, а именно программирование инфраструктуры. Эта инфраструктура включает в себя такие функции как безопасность, управление распределенными транзакциями и управление пулом соединений, которые имеют важнейшее значение для производительности Web-служб. А поскольку компоненты являются повторно используемыми, время разработки существенно уменьшается. Поскольку XML и платформа Java хорошо работают вместе, они стали играть центральную роль в Web-службах. Фактически, преимущества, предлагаемые Java API для XML и платформой J2EE, делают их идеальной комбинацией для размещения Web-служб. Эти API дают возможность сообществу Java, разработчикам и поставщикам сервисных программ и контейнеров начать разработку приложений Web-служб и использование стандартных Java API, составляющих основу принципа технологии Java — Write Once, Run Anywhere™ (пишется один раз, используется везде). Java Web Services Developer Pack (Java WSDP) собирает все эти API в один пакет. Примеры в Java WSDP должны запускаться в контейнере Tomcat (входящим в пакет Java WSDP).

    Обзор стандартных анализаторов DOM и SAX

    Java API for XML Processing (JAXP) предназначен для обработки XML-данных в приложениях, написанных на языке программирования Java. JAXP использует стандарты анализаторов SAX (Simple API for XML Parsing) и DOM (Document Object Model), так что вы можете выбирать между анализом данных как потока событий или построением их объектного представления. JAXP поддерживает также стандарт XSLT (XML Stylesheet Language Transformations), предоставляющий вам контроль над представлением данных и позволяющий преобразование данных в другие XML-документы или в другие форматы, такие как HTML. JAXP обеспечивает также поддержку пространства имен, позволяя вам работать с DTD, которые могли бы в противном случае вызвать конфликт имен.

    JAXP позволяет вам использовать любой XML-совместимый анализатор в вашем приложении. Это обеспечивается при помощи так называемого уровня подключений, который разрешает подключать реализации SAX или DOM API. Уровень подключений позволяет также подключить XSL-процессор, дающий вам контроль над способом отображения ваших XML-данных.

    «Simple API» for XML (SAX) представляет собой основанный на событиях механизм последовательного доступа, осуществляющий обработку «элемент-за-элементом». API этого уровня читает и записывает XML в хранилище данных или Web. Для серверных и высокопроизводительных приложений вы должны полностью понимать этот уровень. Но для многих приложений достаточно минимальных знаний.

    DOM API обычно легче в использовании. Он обеспечивает относительно знакомую древовидную структуру объектов. Вы можете использовать DOM API для управления иерархией объектов приложения, которые он объединяет. DOM API является идеальным для интерактивных приложений, поскольку в памяти присутствует полная модель объектов, к ней можно получить доступ и пользователь может управлять ею.

    Document Object Model (объектная модель документа) является искусственной древовидной структурой, в которой каждый узел содержит один из компонентов XML-структуры. Двумя наиболее общими типами узлов являются узлы элементов и текстовые узлы. Использование функций DOM позволяет вам создавать узлы, удалять узлы, изменять их содержимое и проходить по иерархии узлов.

    С самого начала DOM разрабатывался нейтральным к языку. Поскольку он был предназначался для использования с языками, подобными С или Perl, DOM не использует преимуществ объектно-ориентированных особенностей Java.

    С другой стороны, создание DOM требует чтения полной XML-структуры и хранения дерева объектов в памяти, то есть этот метод использует значительно больше ресурсов CPU и памяти. По этой причине SAX API более предпочтителен для серверных приложений и фильтров данных, которые не требуют наличия данных в памяти.

    Однако SAX-протокол требует гораздо большего объема программирования, чем Document Object Model (DOM). Это управляемая событиями модель (вы обеспечиваете методы обратного вызова, а анализатор вызывает их по мере чтения XML-данных), которая затрудняет визуализацию данных. И, наконец, вы не можете вернуться к предыдущей части документа или реорганизовать его, точно также, как не можете вернуться к предыдущим данным в последовательном потоке данных, или реорганизовать символы, прочитанные из потока. По этим причинам разработчики, создающие ориентированное на пользователя приложение, которое отображает XML-документ и, возможно, модифицирует его, будут, вероятно, использовать DOM-механизм,

    Когда необходимо изменить XML-структуру, особенно если это нужно сделать в интерактивном режиме, больший смысл имеет применение структуры, находящейся в памяти, такой как DOM. Однако, в то время как DOM предоставляет много мощных возможностей для больших документов (таких как книги и статьи), он также требует много сложного кодирования.

    Так как данная курсовая работы представляет собой приложение для работы с небольшими объемами данных, но которые необходимо часто менять, то целесообразно использовать DOM-механизм работы с XML-файлами.

    Илон Маск рекомендует:  Создание анимированной gif-картинки
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL