Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Определение [ править ]

В отличие от DOM , для SAX нет формальной спецификации. Java реализация SAX считается нормативным . [2] SAX обрабатывает документы независимо от состояния, в отличие от DOM, который используется для обработки документов XML в зависимости от состояния. [3]

Преимущества [ править ]

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

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

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

Некоторые реализации не вписываются ни в одну из категорий: подход DOM может сохранять свои постоянные данные на диске, умело организованные для повышения скорости ( это делают редакторы, такие как SoftQuad Author / Editor, и браузеры / индексаторы больших документов, такие как DynaText ); в то время как подход SAX может умно кэшировать информацию для последующего использования (любой проверяющий синтаксический анализатор SAX хранит больше информации, чем описано выше). Такие реализации размывают компромиссы DOM / SAX, но на практике часто очень эффективны.

Из-за природы DOM потоковое чтение с диска требует таких методов, как отложенное вычисление , кеширование, виртуальная память, постоянные структуры данных или другие методы (один из таких методов раскрыт в патенте США 5557722). Обработка XML-документов размером больше основной памяти иногда считается невозможной, потому что некоторые парсеры DOM не позволяют этого. Однако это не менее возможно, чем сортировка набора данных размером больше, чем основная память, с использованием дискового пространства в качестве памяти, чтобы обойти это ограничение. [4]

Недостатки [ править ]

Управляемая событиями модель SAX полезна для синтаксического анализа XML, но у нее есть определенные недостатки.

Практически для любого вида проверки XML требуется полный доступ к документу. Самый тривиальный пример - то, что атрибут, объявленный в DTD как имеющий тип IDREF, требует, чтобы в документе был только один элемент, который использует то же значение для атрибута ID. Чтобы проверить это в синтаксическом анализаторе SAX, необходимо отслеживать все атрибуты ID (на любой из них может в конечном итоге ссылаться атрибут IDREF в самом конце); а также каждый атрибут IDREF, пока он не будет разрешен. Точно так же, чтобы проверить, что каждый элемент имеет приемлемую последовательность дочерних элементов, информация о том, какие дочерние элементы были просмотрены для каждого родителя, должна храниться до закрытия родительского элемента.

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

Обработка XML с помощью SAX [ править ]

Анализатор , который реализует SAX (т.е. саксофона Parser ) функционирует как поток синтаксического анализатора, с событиями API. [1] Пользователь определяет ряд методов обратного вызова, которые будут вызываться при возникновении событий во время синтаксического анализа. События SAX включают (среди прочего):

  • XML-текстовые узлы
  • Элемент XML начинается и заканчивается
  • Инструкции по обработке XML
  • Комментарии XML

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

Существует множество SAX-подобных реализаций. На практике детали различаются, но общая модель остается неизменной. Например, атрибуты XML обычно предоставляются как аргументы имени и значения, передаваемые событиям элемента, но также могут быть предоставлены как отдельные события или через хеш-таблицу или подобную коллекцию всех атрибутов. С другой стороны, некоторые реализации предоставляют обратные вызовы «Init» и «Fin» для самого начала и конца синтаксического анализа; другие этого не делают. Точные имена для данных типов событий также немного различаются между реализациями.

Пример [ править ]

Учитывая следующий XML-документ:

 <? xml version = "1.0" encoding = "UTF-8"?>  <DocumentElement  param = "value" >  <FirstElement>  & # xb6; Некоторый текст </FirstElement>  <? Some_pi some_attr = "some_value"?>  <SecondElement  param2 = "something" > Предварительный текст <Inline> Встроенный текст </Inline> Пост-текст. </SecondElement> </DocumentElement>

Этот XML-документ при передаче через синтаксический анализатор SAX сгенерирует последовательность событий, подобную следующей:

  • XML элемент запуск, названный DocumentElement , с атрибутом парами равно «значению»
  • Начало элемента XML с именем FirstElement
  • Узел XML Text с данными, равными «& # xb6; Some Text» (примечание: некоторые пробелы могут быть изменены)
  • Конец элемента XML с именем FirstElement
  • Событие инструкции обработки с целью some_pi и данными some_attr = "some_value" (содержимое после цели - это просто текст; однако очень часто имитируется синтаксис атрибутов XML, как в этом примере)
  • Начало элемента XML с именем SecondElement с атрибутом param2, равным "something"
  • Узел XML Text с данными, равными "Pre-Text"
  • Начало элемента XML с именем Inline
  • Узел XML Text с данными, равными «Встроенный текст»
  • Конец элемента XML с именем Inline
  • Узел XML Text с данными, равными «Post-text».
  • Конец элемента XML с именем SecondElement
  • Конец элемента XML с именем DocumentElement

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

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

  • Начало элемента XML с именем FirstElement
  • Узел XML Text с данными, равными "& # xb6;" (символ Юникода U + 00b6)
  • Узел XML Text с данными, равными "Some Text"
  • Конец элемента XML с именем FirstElement

См. Также [ править ]

  • Expat (XML)
  • Java API для обработки XML
  • LibXML
  • Список языков разметки XML
  • Список схем XML
  • MSXML
  • StAX
  • Потоковая передача XML
  • VTD-XML
  • Xerces
  • XQuery API для Java

Ссылки [ править ]

  1. ^ a b "SAX" . webopedia.com . ВЕБОПЕДИЯ . Проверено 2 мая 2011 . Сокращение от Simple API for XML, событийного API, который в качестве альтернативы DOM позволяет кому-либо получить доступ к содержимому XML-документа. SAX изначально был API только для Java. Текущая версия поддерживает несколько языковых сред программирования, кроме Java. SAX был разработан участниками списка рассылки XML-DEV.
  2. ^ "saxproject.org" .
  3. ^ «Простой API для XML» . oracle.com . ОРАКУЛ . Проверено 2 мая 2011 . Примечание. В двух словах, SAX ориентирован на независимую от состояния обработку, при которой обработка элемента не зависит от элементов, которые появились раньше. StAX, с другой стороны, ориентирован на обработку, зависящую от состояния. Для более подробного сравнения см. SAX и StAX в разделах «Основные стандарты» и «Когда использовать SAX».
  4. ^ «XML-парсеры: DOM и SAX подвергаются испытанию» . devX . Проверено 20 октября 2011 . Хотя эти тесты этого не показывают, парсеры SAX обычно работают быстрее для очень больших документов, когда модель DOM попадает в виртуальную память или потребляет всю доступную память.

Дальнейшее чтение [ править ]

  • Браунелл, Дэвид (2002). SAX2 . О'Рейли. ISBN 0-596-00237-8.
  • Значит, В. Скотт; Боди, Майкл А. (2002). Книга SAX . Пресс без крахмала. ISBN 1-886411-77-8.

Внешние ссылки [ править ]

  • Домашняя страница SAX