Archive

Posts Tagged ‘SAX’

Определяйте кодировки документов XML при помощи SAX и XNI

May 5th, 2010 No comments

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

В спецификации XML используется Unicode, однако при передаче и хранении в памяти компьютеров символы представляются в виде байтов, анализируемых XML-процессорами (парсерами). Для этого существует ряд различных схем кодировки: UTF-8, UTF-16, ISO-8859-1, Cp1252, SJIS и многих других.

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

* Чаще всего это происходит, если требуется сохранить исходную кодировку документа.
* Другим примером может служить сохранение документа в базе данных в виде строки или крупного символьного объекта (Character Large Object – CLOB) без предварительного разбора.
* Некоторые приложения пересылают документы XML по протоколу HTTP, не анализируя их. Тем не менее при этом необходимо задать правильный тип содержимого в заголовке HTTP, поэтому приходится определять тип кодировки.

Чаще всего вы и так знаете кодировку документа, поскольку сами же его создали. Однако если вы просто получили документ из некоего источника (например, обратившись к ленте Atom), то для определения кодировки лучше всего использовать потоковые API, такие как простой API для XML (SAX), потоковый API для XML (StAX), либо собственный интерфейс Xerces (XNI). Разумеется, можно воспользоваться и интерфейсами, строящими представление документа в виде дерева, например DOM (объектная модель документа), но не забывайте, что они будут считывать в память все содержимое документа, даже если для определения кодировки достаточно просмотреть первые 100 байтов. В отличие от них потоковые API прочитают ровно столько, сколько необходимо, и вернут результат сразу после того как он получен. Это значительно более эффективный способ.

Источник: http://www.ibm.com/developerworks/ru/library/x-tipsaxxni/index.html?S_TACT=105AGX99&S_CMP=GR01

Tags: , ,