Тип XML

8.13. Тип XML

Тип данных xml может быть использован для хранения данных в формате XML. Преимущества хранения XML данных в данном типе по сравнению с хранением в поле типа text, состоит в том, что при вводе значений происходит проверка форматирования, а также в том, что для этого типа есть функции, для выполнения операций над этими данными; см. Section 9.14. Использование этого типа данных требует указать при компиляции configure --with-libxml.

Тип xml может хранить форматированные "документы", как определено стандартом XML, а также фрагменты "материала", которые опредяются результатом работы XMLDecl? content в стандарте XML. Это означает, что фрагменты материала могут иметь более чем один элемент верхнего уровня или символьный узел. Выражение xmlvalue IS DOCUMENT может быть использовано для определения является ли конктрентное xml значение полным документом или же только фрагментом материала.

8.13.1. Создание значений XML

Чтобы создать xml значение из символьных данных, используйте функцию xmlparse:

XMLPARSE ( { DOCUMENT | CONTENT } значение)

Примеры:

XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')
XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')

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

xml '<foo>bar</foo>'
'<foo>bar</foo>'::xml

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

Обратная операция получения значений строки символов из xml, использует функцию: xmlserialize:

XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )

где type может быть character, character varying или text (или псевдоним одного из этих типов). Снова, в соответствии со стандартом SQL, это единственный способ преобразования из типа xml в один из символьных типов, но PostgreSQL также разрешает простое приведение типов.

Когда осуществляется приведение значений символьных строк к xml и обртано без использования соответственно XMLPARSE или XMLSERIALIZE, выбор DOCUMENT или CONTENT определяется с помощью настроечного параметра сессии "XML option" , который можно установить, используя стандартную команду:

SET XML OPTION { DOCUMENT | CONTENT };

или команду в стиле синтаксиса PostgreSQL:

SET xmloption TO { DOCUMENT | CONTENT };

По умолчанию устанавливается CONTENT, так что допускаются все формы данных XML.

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

8.13.2. Управление кодировкой

Необходимо проявлять осторожность при манипуляции кодировками на клиенте, сервере и в данных XML, передаваемых от клиента к серверу и обратно. Когда при выполнении запросов на сервере и получении данных клиентом вы используете текстовый режим (что является нормальным режимом), PostgreSQL конвертирует все символьные данные, передаваемые между клиентом и сервером в соответствующую кодировку; см. Section 22.3. Конвертирование включает строковое представление данных XML, такое как показано в примерах выше. В обычном случае, это означает, что объявления кодировки, содержащиеся в данных XML могут стать неправильными, так как символьные данные конвертируются в другие кодировки при обмене этими данными между клиентом и сервером, потому что встроенное описание кодировки при этом не меняется. При таком поведении, описание кодировки, содержащееся в строке символов, которая вводится в тип xml, игнорируется и содержимому назначается текущая кодировка сервера. Таким образом, чтобы сделать процесс ввода корректным, символьные строки в данных XML должны передаваться клиентом в текущей кодировке клиента. Именно клиент ответственен либо за ковертирование документов в текущую кодировку клиента перед их отправкой на сервер, либо за согласование кодировок. При выводе, значения типа xml не имеют каких-либо описаний кодировки и клиенты должны привести кодировку в соответствие со своей.

Когда для передачи параметров запроса серверу использует бинарный режим и результаты запроса отправляются обратно клиенту, не выполняется никаких преобразований кодировок, потому что ситуация отличается от вышеописанной. В данном случае, будут использовано описание кодировки в данных XML, а если оно отсутствует, будет считаться, что данные в кодировке UTF-8 (как требует стандарт XML; обратите внимание, что PostgreSQL не поддерживает UTF-16). При выводе, в данные будет добавлено описание той кодировки, которая задана клиентом, за исключением случая, когда клиент работает в UTF-8, в этом случае описание кодировки будет опущено.

Необходимо сказать, что обработка данных XML в PostgreSQL будет менее подвержена ошибкам и более эффективна, если кодировка XML данных, кодировка клиента и сервера будут одинаковы. Поскольку внтури XML данные обрабатываются в UTF-8, эта обработка будет наиболее эффективной, если кодировка сервера также будет UTF-8.

Caution

Некоторые относящиеся к XML функции могут не работать для всех не ASCII данных, когда кодировка сервера отлична от UTF-8. Известно, например, про функцию xpath().

8.13.3. Доступ к значениям XML

Тип данных xml примечателен тем, что он не предоставляет никаких операторов сравнения. Это потому, что для данных XML не существует задекларированных и универсальных алгоритмов сравнения. Из этого следует, что вы не можете получить строки с помощью сравнения значений колонок типа xml с каким-либо искомым значением. Значения XML, таким образом, обычно сопровождаются отдельным ключевым полем, таким как ID. Альтернативным решением для сравнения значений XML может служить их конвертация в символьные строки перед выполнением сравнения, но обратите внимание, что сравнение символьных строк является не очень полезным методом в том, что касается сравнения XML.

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

Для ускорения поиска в XML данных также может быть использована функциональность полностекстового поиска в PostgreSQL. Необходимая для этого предварительная обработка поддерживается, однако, не доступна в дистрибутиве PostgreSQL.

Back to top

(С) Виктор Вислобоков, 2008-2023