Простой API для XML
Эта статья нуждается в дополнительных цитатах для проверки . ( август 2008 г. ) |
SAX ( Simple API for XML ) — это управляемый событиями онлайн-алгоритм для лексического анализа и анализа XML- документов с API , разработанным списком рассылки XML-DEV. [1] SAX предоставляет механизм чтения данных из XML-документа, который является альтернативой механизму, предоставляемому объектной моделью документа (DOM). Там, где DOM работает с документом в целом, создавая полное абстрактное синтаксическое дерево XML-документа для удобства пользователя, парсеры SAX работают с каждой частью XML-документа последовательно, выдавая события синтаксического анализа, выполняя при этом один проход через входные данные. транслировать.
Определение
[ редактировать ]В отличие от DOM , для SAX нет формальной спецификации. Реализация SAX на языке Java считается нормативной . [2] SAX обрабатывает документы независимо от состояния, в отличие от DOM, который используется для обработки XML-документов в зависимости от состояния. [3]
Преимущества
[ редактировать ]Парсеру SAX необходимо сообщать только о каждом событии синтаксического анализа по мере того, как оно происходит, и обычно он отбрасывает почти всю эту информацию после сообщения (однако он сохраняет некоторые вещи, например список всех элементов, которые еще не были закрыты, чтобы чтобы обнаружить последующие ошибки, например, закрывающие теги в неправильном порядке). Таким образом, минимальный объем памяти, необходимый для анализатора SAX, пропорционален максимальной глубине файла XML (т. е. дерева XML) и максимальному количеству данных, участвующих в одном событии XML (например, имени и атрибутах одного начального события). тег или содержимое инструкции обработки и т. д.).
Такой большой объем памяти обычно считается незначительным. Анализатор 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 (т. е. 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>
¶ Some Text
</FirstElement>
<?some_pi some_attr="some_value"?>
<SecondElement param2="something">
Pre-Text <Inline>Inlined text</Inline> Post-text.
</SecondElement>
</DocumentElement>
Этот XML-документ, пройдя через анализатор SAX, сгенерирует последовательность событий, подобную следующей:
- Начало XML-элемента с именем DocumentElement атрибута, с параметром равным «значению».
- Начало XML-элемента с именем FirstElement
- Узел XML Text с данными, равными «Некоторый текст» (примечание: некоторые пробелы можно изменить)
- Конец XML-элемента с именем FirstElement
- Событие инструкции обработки с целью some_pi и данными some_attr="some_value" (содержимое после цели представляет собой просто текст; однако очень часто имитируют синтаксис атрибутов XML, как в этом примере)
- Начало XML-элемента с именем SecondElement с атрибутом param2 , равным «что-то».
- Узел 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 с данными, равными "¶" (символ Юникода U+00b6)
- Узел XML Text с данными, равными «Некоторый текст».
- Конец XML-элемента с именем FirstElement
См. также
[ редактировать ]- Экспат (XML)
- Java API для обработки XML
- LibXML
- Список языков разметки XML
- Список XML-схем
- MSXML
- RapidJSON — SAX-подобный API для JSON.
- StAX
- Потоковая передача XML
- VTD-XML
- Ксерцес
- API XQuery для Java
Ссылки
[ редактировать ]- ^ Jump up to: а б «САКС» . webopedia.com . ВЕБОПЕДИЯ . Проверено 2 мая 2011 г.
Сокращение от Simple API for XML, API на основе событий, который в качестве альтернативы DOM позволяет кому-либо получить доступ к содержимому XML-документа. SAX изначально был API только для Java. Текущая версия поддерживает несколько языков программирования, кроме Java. SAX был разработан участниками списка рассылки XML-DEV.
- ^ «saxproject.org» .
- ^ «Простой API для XML» . oracle.com . ОРАКУЛ . Проверено 2 мая 2011 г.
Примечание. Короче говоря, SAX ориентирован на обработку, независимую от состояния, при которой обработка элемента не зависит от предыдущих элементов. StAX, с другой стороны, ориентирован на обработку, зависящую от состояния. Более подробное сравнение см. в разделах SAX и StAX в «Базовых стандартах» и «Когда использовать SAX».
- ^ «Парсеры XML: испытание DOM и SAX» . devX. Февраль 2001 года . Проверено 20 октября 2011 г.
Хотя эти тесты этого не показывают, парсеры SAX обычно работают быстрее для очень больших документов, где модель DOM использует виртуальную память или использует всю доступную память.
Дальнейшее чтение
[ редактировать ]- Браунелл, Дэвид (2002). САКС2 . О'Рейли. ISBN 0-596-00237-8 .
- Минс, В. Скотт; Боди, Майкл А. (2002). Книга САКС . Нет крахмального пресса. ISBN 1-886411-77-8 .