XML-функции PostgreSQL
Вступление
Это руководство посвящено использованию функций и функций, подобных выражениям PostgreSQL (мы использовали версию 9.3), которые работают с типом данных xml. Тип данных XML используется для хранения документов XML.
Назначение этих функций (и функций, подобных выражениям) состоит в том, чтобы генерировать XML-документы из данных SQL. Созданные таким образом XML-документы могут быть использованы для дальнейшей обработки другими приложениями.
функция xmlcomment ()
эта функция создает закомментированное значение XML. '-' и '-' добавляются до и после значения, чтобы сделать его действительным комментарием XML. Если аргумент равен нулю, результат равен нулю.
Синтаксис:
xmlcomment (текст)
пример
Код:
SELECT xmlcomment('this is a comment');
Вот результат.
Пример вывода:
xmlcomment -------------------- <! - Это комментарий -> (1 ряд)
функция xmlconcat ()
С помощью этой функции список значений XML объединяется для создания единого значения. Нулевые значения не рассматриваются в этой функции. Результат будет нулевым, если нет ненулевых аргументов.
Синтаксис:
xmlconcat (xml [, ...])
пример
Код:
SELECT xmlconcat('<books/>', '<book>w3resource tutorials</book>');
Вот результат.
Пример вывода:
xmlconcat ------------------------------------------- <books /> <book> w3resource руководства </ book> (1 ряд)
Объявления XML, если они есть, объединяются следующим образом. Если все значения аргументов имеют одно и то же объявление версии XML, эта версия используется в результате, в противном случае версия не используется. Если все значения аргументов имеют автономное значение объявления «да», то это значение используется в результате. Если все значения аргумента имеют отдельное значение объявления и по крайней мере одно - «нет», то это используется в результате. В противном случае результат не будет иметь отдельной декларации. Если для результата определено, что требуется отдельное объявление, но нет объявления версии, будет использоваться объявление версии с версией 1.0, поскольку для XML требуется, чтобы объявление XML содержало объявление версии. Декларации кодирования игнорируются и удаляются во всех случаях.
если присутствуют какие-либо объявления XML, они используются следующим образом:
- Если версия (деклараций XML) присутствует во всех значениях аргумента, эта версия используется
- Если все значения аргументов имеют автономные значения объявления yes, это значение используется
- Если все значения аргументов имеют автономные значения объявления no, это значение используется
- если 2 и 3 не удовлетворены, в результирующем XML используется объявление not
- Если для результата определено, что требуется отдельное объявление, но нет объявления версии, будет использовано объявление версии с версией 1.0
- Декларации кодирования, если они найдены, игнорируются и не используются.
пример
Код:
SELECT xmlconcat('<?xml version="1.1"?><books/>', '<?xml version="1.1" standalone="no"?><book/>');
Вот результат.
Пример вывода:
xmlconcat ----------------------------------- <? xml version = "1.1"?> <books /> <book /> (1 ряд)
функция xmlelement ()
Эта функция генерирует элемент XML с заданным именем, атрибутами и содержимым.
Синтаксис:
xmlelement (имя name [, xmlattributes (значение [AS attname] [, ...])] [, content, ...])
пример
Код:
SELECT xmlelement(name books);
Вот результат.
Пример вывода:
XmlElement ------------ <Книги /> (1 ряд)
Вот еще один пример
Код:
SELECT xmlelement(name books, xmlattributes('title' as w3resource));
Вот результат.
Пример вывода:
XmlElement ------------------ <books title = "w3resource" /> (1 ряд)
Вот еще один пример.
Код:
SELECT xmlelement(name calendar, xmlattributes(current_date as date), 'current', ' date');
Вот результат.
Пример вывода:
XmlElement ------------------------------------------- <calendar date = "2014-11-03"> текущая дата </ abc> (1 ряд)
если какое-либо значение не удовлетворяет условиям, чтобы быть действительным именем или атрибутом XML, недопустимые символы XML заменяются последовательностью _xHHHH_, где HHHH - это кодовая точка Unicode символа в шестнадцатеричной записи.
пример
Код:
SELECT xmlelement(name "book$name", xmlattributes('title' as "w3r%esource"));
Вот результат.
Пример вывода:
XmlElement ---------------------------------- <book_x0024_name w3r_x0025_esource = "title" /> (1 ряд)
Явное имя атрибута не нужно указывать, если значение атрибута является ссылкой на столбец, и в этом случае имя столбца будет использоваться в качестве имени атрибута по умолчанию. В других случаях атрибуту должно быть дано явное имя.
Если значение атрибута является ссылкой на столбец, имя атрибута нельзя использовать явно. В противном случае имя атрибута должно иметь явное имя.
пример
Код:
CREATE TABLE demo_table (p xml, q xml);
SELECT xmlelement(name demo_table, xmlattributes(p, q)) FROM demo_table;
Вот результат.
Пример вывода:
XmlElement ------------ (0 строк)
Но это не так:
пример
Код:
SELECT xmlelement(name demo_table, xmlattributes('hello'), p, q) FROM demo_table;
SELECT xmlelement(name demo_table, xmlattributes(func(p, q))) FROM demo_table;
Содержимое элемента форматируется в соответствии с его типом данных. Если сам контент имеет тип XML, могут быть созданы сложные XML-документы.
пример
Код:
SELECT xmlelement(name newelement, xmlattributes('xyz' as bar),
xmlelement(name abc),
xmlcomment('test'),
xmlelement(name xyz));
Вот результат.
Пример вывода:
XmlElement -------------------------------------------------- ---------- <books title = "w3r"> <w3r /> <! - demo -> <title /> </ books> (1 ряд)
Другие типы форматируются в допустимые символьные данные XML. Следуя этому правилу, <,> и & будут преобразованы в объекты. Двоичные данные (байты типа данных) будут представлены в виде base64 или шестнадцатеричной кодировки, в зависимости от значения параметра конфигурации xmlbinary. Ожидается, что конкретное поведение для отдельных типов данных будет развиваться, чтобы привести типы данных SQL и PostgreSQL в соответствие со спецификацией схемы XML, после чего появится более точное описание.
функция xmlforest ()
Выражение xmlforest создает XML-лес (т. Е. Последовательность) элементов, для которых используются заданные имена и содержимое.
Синтаксис:
xmlforest (content [AS name] [, ...])
пример
Код:
SELECT xmlforest('book' AS newelement, 123 AS number);
Вот результат.
Пример вывода:
XMLFOREST -------------------------------------------- <Newelement> книга </ newelement> <число> 123 </ номер> (1 ряд)
пример
Код:
SELECT xmlforest(table_name, column_name)
FROM information_schema.columns
WHERE table_schema ='pg_catalog';
В приведенном выше примере показано, что если значением содержимого элемента является ссылка на столбец, по умолчанию используется имя столбца. Иначе имя должно быть упомянуто.
Имена элементов, которые не являются допустимыми именами XML, экранируются. если не указан тип XML, данные содержимого экранируются для создания допустимого содержимого XML.
Леса XML, если они содержат более одного элемента XML, не являются допустимыми документами XML. Таким образом, полезно переносить выражения xmlforest в xmlelement.
функция xmlpi ()
Инструкции обработки XML генерируются с использованием функции xmlpi. если инструкция обработки содержит последовательность символов?>, то она не генерируется.
Синтаксис:
xmlpi (имя цели [, содержимое])
пример
Код:
SELECT xmlpi(name php, 'echo "this is w3resource";');
Вот результат.
Пример вывода:
XMLPI ------------------------------------ <? php echo "это w3resource";?> (1 ряд)
функция xmlroot ()
Выражение xmlroot используется для изменения свойств корневого узла значения XML. Если указана версия, она заменяет значение в объявлении версии корневого узла; если указан автономный параметр, он заменяет значение в автономном объявлении корневого узла.
Синтаксис:
xmlroot (xml, текст версии | нет значения [, автономно да | нет | нет значения])
пример
Код:
SELECT xmlroot(xmlparse(document '<?xml version="1.1"?><content>w3resource</content>'),
version '1.0', standalone yes);
Вот результат.
Пример вывода:
xmlroot -------------------------------------------------- ------------------- <? xml version = "1.0" standalone = "yes"?> <content> w3resource </ content> (1 ряд)
функция xmlagg ()
Функция xmlagg, в отличие от других описанных здесь функций, является агрегатной функцией. Он объединяет входные значения с вызовом агрегатной функции, во многом как xmlconcat, за исключением того, что объединение происходит по строкам, а не по выражениям в одной строке.
Синтаксис:
XMLAgg (XML)
пример
Код:
CREATE TABLE demo (p int, q xml);
INSERT INTO demo VALUES (1, '<foo>abc</foo>');
INSERT INTO demo VALUES (2, '<bar/>');
SELECT xmlagg(p) FROM demo;
Вот результат.
Пример вывода:
XMLAgg -------------------------------------------------- ---------------------- <Foo> ABC </ Foo> <бар /> <бар /> <бар /> <Foo> ABC </ Foo> <бар /> (1 ряд)
Предложение ORDER BY может использоваться для определения порядка объединения.
пример
Код:
SELECT xmlagg(q ORDER BY p DESC) FROM demo;
Вот результат.
Пример вывода:
XMLAgg -------------------------------------------------- ---------------------- <Бар /> </ бар /> <бар /> <бар /> <Foo> ABC </ Foo> <Foo> ABC </ Foo> (1 ряд)
пример
Код:
SELECT xmlagg(q) FROM (SELECT * FROM demo ORDER BY p DESC) AS tab;
Вот результат.
Пример вывода:
XMLAgg -------------------------------------------------- ---------------------- <Бар /> <бар /> <бар /> <бар /> <Foo> ABC </ Foo> <Foo> ABC </ Foo> (1 ряд)
Хотя и нестандартный, в предыдущих версиях был предложен следующий подход. это все еще может быть полезно.
Предикаты XML
Выражения, описанные в этом разделе, проверяют свойства значений xml.
ЭТО ДОКУМЕНТ
если значение аргумента XML является правильным документом XML, выражение IS DOCUMENT возвращает true. Если это фрагмент содержимого, он возвращает false. null возвращается, если аргумент нулевой.
Синтаксис:
XML - ДОКУМЕНТ
XMLEXISTS
Функция xmlexists возвращает true, если выражение XPath в первом аргументе возвращает какие-либо узлы, и false в противном случае. (Если один из аргументов равен нулю, результат равен нулю.)
Синтаксис:
XMLEXISTS (текст PASSING [BY REF] xml [BY REF])
пример
Код:
SELECT xmlexists('//games[text() = ''Soccer'']' PASSING BY REF '<games><game>Soccer</game><game>football</game></games>');
Вот результат.
Пример вывода:
XMLEXISTS ----------- е (1 ряд)
Хотя это не оказывает никакого влияния на PostgreSQL, оно включено для соответствия стандарту SQL. Первый BY REF является обязательным, но второй является необязательным. Поскольку PostgreSQL в настоящее время поддерживает только XPath (который является подмножеством xQuery), несмотря на то, что стандарты SQL говорят, что он должен использовать XQuery, используется XPath.
Функция xml_is_well_formed ()
Функция xml_is_well_formed () проверяет, является ли текстовая строка правильно сформированным XML. Возвращает логический результат. xml_is_well_formed_document проверяет правильно сформированный документ. xml_is_well_formed_content проверяет правильно сформированный контент. xml_is_well_formed выполняет первое, если для параметра конфигурации xmloption задано значение DOCUMENT, или второе, если для него задано CONTENT. Это означает, что xml_is_well_formed полезен для определения успешности простого приведения к типу xml, тогда как две другие функции полезны для определения успешности соответствующих вариантов XMLPARSE.
Синтаксис:
xml_is_well_formed (текст) xml_is_well_formed_document (текст) xml_is_well_formed_content (текст)
пример
Код:
SET xmloption TO DOCUMENT;
SELECT xml_is_well_formed('<>');
Вот результат.
Пример вывода:
УСТАНАВЛИВАЙТЕ xmloption TO DOCUMENT; SELECT xml_is_well_formed ('<>');
пример
Код:
SELECT xml_is_well_formed(' ');
Вот результат.
Пример вывода:
xml_is_well_formed -------------------- T (1 ряд)
пример
Код:
SET xmloption TO CONTENT;
SELECT xml_is_well_formed('w3resource');
Вот результат.
Пример вывода:
xml_is_well_formed -------------------- T (1 ряд)
пример
Код:
SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>');
пример
Код:
SELECT xml_is_well_formed_document('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</my:foo>');
Последний пример показывает, что проверки включают в себя, правильно ли сопоставлены пространства имен.
Обработка XML
PostgreSQL предоставляет разработчикам функции xpath и xpath_exists для обработки значений типа данных XML.
функция xpath ()
Синтаксис:
xpath (xpath, xml [, nsarray])
Функция xpath оценивает выражение XPath. он возвращает массив значений XML. Эти значения относятся к набору узлов, сгенерированному связанным выражением XPath. Если он возвращает скалярное значение вместо набора узлов, требуется массив с единственным элементом.
Второй аргумент должен быть правильно сформированным документом XML. В частности, он должен иметь один элемент корневого узла.
Третий аргумент функции - это массив отображений пространства имен. Этот аргумент не является обязательным. Это должен быть двумерный текстовый массив. Длина второй оси должна быть равна 2. Имя пространства имен и URI пространства имен - это первая и вторая записи массива. Не требуется, чтобы псевдонимы, предоставленные в этом массиве, были такими же, как и используемые в самом XML-документе.
пример
Код:
SELECT xpath('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>',
ARRAY[ARRAY['my', 'http://example.com']]);
Вот результат.
Пример вывода:
XPath -------- {тестовое задание} (1 ряд)
В следующем примере показано, как обрабатывать пространства имен по умолчанию
пример
Код:
SELECT xpath('//mydefns:b/text()', '<x xmlns="http://example.com"><y>test</y></x>',
ARRAY[ARRAY['mydefns', 'http://example.com']]);
Вот результат.
Пример вывода:
XPath ------- {} (1 ряд)
Функция xpath_exists является специализированной формой функции xpath. Вместо того, чтобы возвращать отдельные значения XML, которые удовлетворяют XPath, эта функция возвращает логическое значение, указывающее, был ли выполнен запрос или нет. Эта функция эквивалентна стандартному предикату XMLEXISTS, за исключением того, что она также поддерживает аргумент сопоставления пространства имен.
Синтаксис:
xpath_exists (xpath, xml [, nsarray])
пример
Код:
SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a',
ARRAY[ARRAY['my', 'http://example.com']]);
Вот результат.
Пример вывода:
Вернуть
Отображение таблиц в XML
Следующие функции отображают содержимое реляционных таблиц в значения XML. Их можно рассматривать как функцию экспорта XML:
Синтаксис:
table_to_xml (tbl regclass, логическое значение null, логическое значение tableforest, текст targetns) query_to_xml (текст запроса, логическое значение null, логическое значение tableforest, текст targetns) cursor_to_xml (указатель курсора, число int, логическое значение null, табличный лес логический, целевой текст)
Тип возврата
Тип возврата каждой функции - xml.
table_to_xml отображает содержимое именованной таблицы, передаваемой как параметр tbl. Тип regclass принимает строки, идентифицирующие таблицы, используя обычные обозначения, включая необязательные квалификации схемы и двойные кавычки. query_to_xml выполняет запрос, текст которого передается как параметр запроса, и отображает набор результатов. cursor_to_xml извлекает указанное количество строк из курсора, указанного параметром курсора. Этот вариант рекомендуется, если необходимо сопоставить большие таблицы, потому что значение функции создается в памяти каждой функцией.
Если tableforest имеет значение false, то полученный XML-документ выглядит следующим образом:
пример
Код:
<tablename>
<row>
<columnname1>data</columnname1>
<columnname2>data</columnname2>
</row>
<row>
...
</row>
...
</tablename>
Если tableforest имеет значение true, результатом является фрагмент содержимого XML, который выглядит следующим образом:
пример
Код:
<tablename>
<columnname1>data</columnname1>
<columnname2>data</columnname2>
</tablename>
<tablename>
...
</tablename>
...
Если имя таблицы недоступно, то есть при отображении запроса или курсора таблица строк используется в первом формате, строка - во втором формате.
Выбор между этими форматами остается за пользователем. Первый формат - это правильный XML-документ, который будет важен во многих приложениях. Второй формат имеет тенденцию быть более полезным в функции cursor_to_xml, если значения результата должны быть позже собраны в один документ. Обсуждаемые выше функции для создания XML-контента, в частности, xmlelement, могут использоваться для изменения результатов по вкусу.
Значения данных отображаются так же, как описано выше для функции xmlelement.
Параметр nulls определяет, должны ли нулевые значения быть включены в выходные данные. Если true, нулевые значения в столбцах представлены как:
<columnname xsi: nil = "true" />
где xsi - префикс пространства имен XML для экземпляра схемы XML. Соответствующее объявление пространства имен будет добавлено к значению результата. Если false, столбцы, содержащие нулевые значения, просто не включаются в вывод.
Параметр target указывает желаемое пространство имен XML для результата. Если конкретное пространство имен не требуется, должна быть передана пустая строка.
Следующие функции возвращают документы схемы XML, описывающие сопоставления, выполняемые соответствующими функциями выше:
пример
Код:
table_to_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
cursor_to_xmlschema(cursor refcursor, nulls boolean, tableforest boolean, targetns text)
Важно, чтобы одни и те же параметры передавались для получения соответствующих сопоставлений данных XML и документов схемы XML.
Следующие функции создают сопоставления данных XML и соответствующую XML-схему в одном документе (или лесу), связанных вместе. Они могут быть полезны, когда требуются автономные и самоописываемые результаты:
пример
Код:
table_to_xml_and_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xml_and_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
Кроме того, доступны следующие функции для создания аналогичных отображений всей схемы или всей текущей базы данных:
пример
Код:
schema_to_xml(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xml_and_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
database_to_xml(nulls boolean, tableforest boolean, targetns text)
database_to_xmlschema(nulls boolean, tableforest boolean, targetns text)
database_to_xml_and_xmlschema(nulls boolean, tableforest boolean, targetns text)
Обратите внимание, что они потенциально могут производить много данных, которые должны быть встроены в память. При запросе сопоставлений содержимого больших схем или баз данных может оказаться целесообразным вместо этого рассмотреть сопоставление таблиц отдельно, возможно даже через курсор.
Результат отображения содержимого схемы выглядит следующим образом:
Вот результат.
Пример вывода:
<SchemaName> table1-отображение table2-отображение ... </ SchemaName>
где формат отображения таблицы зависит от параметра tableforest, как описано выше.
Результат отображения содержимого базы данных выглядит следующим образом:
Вот результат.
Пример вывода:
<Имя_бд> <Schema1name> ... </ Schema1name> <Schema2name> ... </ Schema2name> ... </ Имя_бд>
где отображение схемы такое же, как указано выше.
В качестве примера использования выходных данных, создаваемых этими функциями, показана таблица стилей XSLT, которая преобразует выходные данные table_to_xml_and_xmlschema в документ HTML, содержащий табличное представление данных таблицы. Аналогичным образом результаты этих функций могут быть преобразованы в другие форматы на основе XML.
Предыдущий: функции диапазона и операторы
Далее: Функции текстового поиска и операторы
Новый контент: Composer: менеджер зависимостей для PHP , R программирования