XML-функции PostgreSQL

Введение

Это руководство посвящено использованию функций и функций, подобных выражениям PostgreSQL (мы использовали версию 9.3), которые работают с типом данных xml. Тип данных XML используется для хранения документов XML.

Целью этих функций (и функций, подобных выражениям) является создание документов XML из данных SQL. Созданные таким образом XML-документы могут использоваться для дальнейшей обработки другими приложениями.

Функция xmlcomment ()

эта функция создает закомментированное значение XML. «-» и «-» добавляются до и после значения, чтобы сделать его допустимым комментарием XML. Если аргумент имеет значение NULL, результатом будет NULL.

Синтаксис:

 xmlcomment (text) 

Пример

Код:

  SELECT xmlcomment ('this is a comment');  

Вот результат.

Пример вывода:

 xmlcomment -----------  ---------  (1 строка) 

функция xmlconcat ()

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

Синтаксис:

 xmlconcat (xml [, ...  ]) 

Пример

Код:

  SELECT xmlconcat ('   ','  руководства по w3resource  ');  

Вот результат.

Пример вывода:

 xmlconcat ----------------------------  ---------------   учебные пособия по w3resource  (1 строка) 

Объявления XML, если они есть, объединяются как следует. Если все значения аргументов имеют одно и то же объявление версии XML, эта версия используется в результате, иначе версия не используется. Если все значения аргументов имеют значение автономного объявления «да», то это значение используется в результате. Если все значения аргументов имеют значение отдельного объявления и хотя бы одно из них — «нет», то оно используется в результате. В противном случае у результата не будет отдельного объявления. Если в результате определено, что требуется отдельное объявление, но не объявление версии, будет использоваться объявление версии с версией 1.0, поскольку XML требует, чтобы объявление XML содержало объявление версии. Объявления кодировки игнорируются и удаляются во всех случаях.

если присутствуют какие-либо объявления XML, они используются следующим образом:

  1. Если версия ( объявлений XML) присутствует во всех значениях аргументов, используется эта версия
  2. Если все значения аргументов имеют значения автономных объявлений, да, это значение используется
  3. Если все аргументы значения имеют автономные значения декларации no, это значение используется
  4. , если 2 и 3 не удовлетворяют, в результирующем XML используется объявление not
  5. Если результат определен чтобы потребовать отдельное объявление, но без объявления версии, объявление версии с версией 1. Будет использоваться 0
  6. Объявления кодировки, если они найдены, игнорируются и не используются.

Пример

Код:

  ВЫБРАТЬ xmlconcat (' xml version = "1.1"?> ', ' xml version = "  1.1 "standalone =" no "?>  ');  

Вот результат.

Пример вывода:

 xmlconcat ----------------------------  -------  xml version = "1.1"?>   (1 строка) 

функция xmlelement ()

Эта функция генерирует элемент XML с заданным именем, атрибутами и содержимым.

Синтаксис:

 xmlelement (name name  [, xmlattributes (значение [AS attname] [, ...])] [, content, ...]) 

Пример

Код:

  SELECT xmlelement (name books);  

Вот результат.

Пример вывода:

 xmlelement ------------  (1 строка) 

Вот еще один пример.

Код:

  SELECT xmlelement (name books, xmlattributes ('title'  как w3resource));  

Вот результат.

Пример вывода:

 xmlelement ------------------  (  1 строка) 

Другой пример.

Код:

  ВЫБРАТЬ xmlelement (название календаря, xmlattributes (current_date как дата), 'current', 'date')  ;  

Вот результат.

Пример вывода:

 xmlelement ----------------------------  ---------------  текущая дата  (1 строка) 

, если какое-либо значение соответствует не удовлетворяют условиям, чтобы быть допустимым именем или атрибутом XML, недопустимые символы XML заменяются последовательностью _xHHHH_, где HHHH — кодовая точка Unicode символа в шестнадцатеричной системе счисления.

Пример

Код:

  ВЫБРАТЬ xmlelement (имя "book $ name", xmlattributes ('title' как "w3r% esource"  ));  

Вот результат.

Пример вывода:

 xmlelement ----------------------------  ------  (1 строка) 

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

Если значение атрибута является ссылкой на столбец, имя атрибута не может использоваться явно. В противном случае имя атрибута должно иметь явное имя.

Пример

Код:

  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-документы.

Пример

Код:

  ВЫБРАТЬ xmlelement (имя newelement, xmlattributes ('xyz' как bar), xmlelement (имя abc), xmlcomment ('test'), xmlelement (name xyz));  

Вот результат.

Пример вывода:

 xmlelement ----------------------------  --------------------------------      (1 строка) 

Другие типы форматируются в допустимые символьные данные XML. Следуя этому правилу, и & будут преобразованы в сущности. Двоичные данные (тип данных байт) будут представлены в кодировке base64 или hex, в зависимости от настройки параметра конфигурации xmlbinary. Ожидается, что конкретное поведение для отдельных типов данных будет развиваться, чтобы привести типы данных SQL и PostgreSQL в соответствие со спецификацией схемы XML, после чего появится более точное описание.

Функция xmlforest ()

Выражение xmlforest создает лес XML (т. е. последовательность) элементов, которые используют заданные имена и содержимое.

Синтаксис:

 xmlforest (content [AS name] [, ...]) 

Пример

Код:

  SELECT xmlforest ('book' AS newelement, 123 AS number);  

Вот результат.

Пример вывода:

 xmlforest ----------------------------  ----------------  книга   123  (1 строка) 

Пример

Код:

  ВЫБРАТЬ xmlforest (имя_таблицы, имя_столбца) ИЗ information_schema.columnsWHERE table_schema = 'pg_catalog';  

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

Имена элементов, которые не являются допустимыми именами XML, экранируются. если не тип XML, данные содержимого экранируются для создания допустимого содержимого XML.

XML-леса, если они содержат более одного XML-элемента, не являются допустимыми XML-документами. Таким образом, полезно заключать выражения xmlforest в оболочку в xmlelement.

Функция xmlpi ()

Инструкции по обработке XML генерируются с использованием функции xmlpi. если инструкция обработки содержит последовательность символов?>, то она не генерируется.

 xmlpi (name target [, content]) 

Пример

Код:

  SELECT xmlpi (name php, 'echo "this is w3resource";');  

Вот результат.

Пример вывода:

 xmlpi ----------------------------  --------  php echo "this is w3resource";?> (1 строка) 

функция xmlroot ()

Выражение xmlroot используется для изменения свойств корневого узла значения XML. Если указана версия, она заменяет значение в объявлении версии корневого узла; если указан автономный параметр, он заменяет значение в автономном объявлении корневого узла.

Синтаксис:

 xmlroot (xml  , версия текст | без значения [, автономный да | нет | без значения]) 

Пример

Код:

  ВЫБРАТЬ xmlroot (xmlparse (document ' xml version = "1.1"?>  w3resource '), версия '1.0', автономный режим да);  

Вот результат.

Пример вывода:

 xmlroot ----------------------------  -----------------------------------------  xml version = "1.0" автономный  = "yes"?>  w3resource  (1 строка) 

функция xmlagg ()

Функция xmlagg, в отличие от других описанных функций здесь агрегатная функция. Он объединяет входные значения с вызовом агрегатной функции, как это делает xmlconcat, за исключением того, что объединение происходит между строками, а не между выражениями в одной строке.

Синтаксис:

 xmlagg (xml) 

Пример

Код:

  CREATE TABLE demo (p int, q xml); INSERT INTO demo VALUES (1, ' abc '); INSERT INTO demo VALUES (2, '  '); SELECT xmlagg (p) FROM demo;  

Вот результат.

Пример вывода:

 xmlagg ----------------------------  --------------------------------------------  abc      abc   (1 row) 

предложение ORDER BY может использоваться для определения порядка конкатенации.

Пример

Код:

  SELECT xmlagg (  q ORDER BY p DESC) FROM demo;  

Вот результат.

Пример вывода:

 xmlagg ----------------------------  --------------------------------------------      abc   abc  (1 строка) 

Пример

Код:

  SELECT xmlagg (q) FROM (SELECT * FROM demo ORDER BY p DESC) AS tab;  

Вот результат.

Пример вывода:

 xmlagg ----------------------------  --------------------------------------------      abc   abc  (1 row) 

Хотя нестандартный, в предыдущие версии. он все еще может быть полезен.

Предикаты XML

Выражения, описанные в этом разделе, проверяют свойства значений xml.

ЕСТЬ ДОКУМЕНТ

, если значение аргумента XML является правильным XML-документом, выражение IS DOCUMENT возвращает истину. Если это фрагмент содержимого, он возвращает false. null возвращается, если аргумент равен нулю.

 xml ЕСТЬ ДОКУМЕНТ 

XMLEXISTS

Функция xmlexists возвращает истину, если выражение XPath в первом аргументе возвращает какие-либо узлы, и ложь в противном случае. (Если любой из аргументов имеет значение NULL, результатом будет NULL.)

Синтаксис:

 XMLEXISTS (текст PASSING [BY REF]  xml [BY REF]) 

Пример

Код:

   ВЫБРАТЬ xmlexists ('//games [text () =' 'Soccer' ']' ПРОХОДЯТ REF '  Soccer   football  ');  

Вот результат.

Пример вывода:

 xmlexists ----------- f (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 (текст) 

Пример

Код:

  УСТАНОВИТЬ xmloption В ДОКУМЕНТ; ВЫБРАТЬ xml_is_well_formed ('');  

Вот результат.

Пример вывода:

 SET xmloption TO DOCUMENT; SELECT xml_is_well_formed (''); 

Пример

Код:

  ВЫБРАТЬ xml_is_well_formed (' ');  

Вот результат.

Пример вывода:

 xml_is_well_formed -------------------- t (1 строка) 

Пример

Код:

  УСТАНОВИТЬ xmloption В СОДЕРЖАНИЕ; ВЫБРАТЬ xml_is_well_formed ('  w3resource ');  

Вот результат.

Пример вывода:

 xml_is_well_formed -------------------- t (1 строка) 

Пример

Код:

  SELECT xml_is_well_formed_document (' bar foo> ');  

Пример

Код:

  ВЫБРАТЬ xml_is_well_formed_document (' bar 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 ()', ' test  a> ', ARRAY [ARRAY [' my ',' http://example.com ']]);  

Вот результат.

Пример вывода:

 xpath -------- {test} (1 строка) 

В следующем примере показано, как для обработки пространств имен по умолчанию

Пример

Код:

  SELECT xpath  ('//mydefns: b/text ()', '  test  ', 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 ()', ' test a', ARRAY [ARRAY [  'my', 'http://example.com']]);  

Вот результат.

Пример вывода:

 Return 

Отображение таблиц в XML

Следующие функции отображают содержимое реляционных таблиц в значения XML. Их можно рассматривать как функцию экспорта XML:

Синтаксис:

 table_to_xml (tbl regclass, nulls boolean, tableforest boolean,  targetns text) query_to_xml (текст запроса, логическое значение null, логическое значение tableforest, текст targetns) cursor_to_xml (указатель курсора, число int, логическое значение null, логическое значение tableforest, текст targetns) 

Тип возвращаемого значения

Тип возврата каждой функции — xml.

table_to_xml отображает содержимое указанной таблицы, переданной как параметр tbl. Тип regclass принимает строки, идентифицирующие таблицы, используя обычную нотацию, включая необязательные уточнения схемы и двойные кавычки. query_to_xml выполняет запрос, текст которого передается как запрос параметра, и сопоставляет набор результатов. cursor_to_xml извлекает указанное количество строк из курсора, указанного параметром cursor. Этот вариант рекомендуется, если необходимо сопоставить большие таблицы, потому что значение результата накапливается в памяти каждой функцией.

Если tableforest имеет значение false, то результирующий XML-документ выглядит следующим образом:

Пример

Код:

      данные   данные    ...  ...   

Если tableforest истина, результатом является фрагмент содержимого XML, который выглядит следующим образом:

Пример

Код:

    data  data  ...  ...  

Если имя таблицы недоступно, то есть при отображении запроса или курсора, таблица строк используется в первом формате, а строка — во втором формате.

Выбор между этими форматами остается за пользователем. Первый формат — это правильный XML-документ, который будет важен во многих приложениях. Второй формат имеет тенденцию быть более полезным в функции cursor_to_xml, если результирующие значения должны быть повторно собраны в один документ позже. Функции для создания XML-контента, описанные выше, в частности xmlelement, могут использоваться для изменения результатов по вкусу.

Значения данных отображаются таким же образом, как описано для функции xmlelement выше.

Параметр NULL определяет, следует ли включать в вывод нулевые значения. Если true, нулевые значения в столбцах представлены как:

  

, где xsi — это префикс пространства имен XML для схемы XML. Пример. Соответствующее объявление пространства имен будет добавлено к результату. Если false, столбцы, содержащие нулевые значения, просто не выводятся из вывода.

Целевые параметры параметров определяют желаемое пространство имен XML для результата. Если конкретное пространство имен не требуется, следует передать пустую строку.

Следующие функции возвращают документы схемы XML, описывающие сопоставления, выполняемые соответствующими функциями выше:

Пример

Код:

  table_to_xmlschema (tbl regclass, nulls boolean, tableforest boolean, targetns text) query_to_xmlschema (  текст запроса, логическое значение null, логическое значение tableforest, текст targetns) cursor_to_xmlschema (refcursor курсора, логическое значение null, логическое значение tableforest, текст targetns)  

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

Следующие функции создают сопоставления данных XML и соответствующую схему XML в одном документе (или лесу), связанных вместе. Они могут быть полезны там, где требуются автономные результаты с самоописанием:

Пример

Код:

  table_to_xml_and_xmlschema (tbl regclass, логическое значение null, логическое значение tableforest, текст targetns) query_to_xml_and_xmlschema (текст запроса, логическое значение null, логическое значение tableforest, текст targetns)  

Кроме того, доступны следующие функции для создания аналогичных отображений всей схемы или всей текущей базы данных:

Пример

Код:

  schema_to_xml (имя схемы, логическое значение null, логическое значение tableforest, текст targetns) schema_to_xmlschema (имя схемы, логическое значение null, логическое значение tableforest, текст targetns) schema_to_xml_and_xmlschema (имя схемы,  логическое, tableforest логическое, текст targetns) database_to_xml (логическое значение null, логическое значение tableforest, текст targetns) database_to_xmlschema (логическое значение null, логическое значение tableforest, текст targetns) database_to_xml_and_xmlschema (логическое значение null, логическое значение tableforest,  targetns text)  

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

Результат сопоставления содержимого схемы выглядит следующим образом:

Вот результат.

Пример вывода:

table1-mappingtable2-mapping... 

где формат сопоставление таблиц зависит от параметра tableforest, как описано выше.

Результат сопоставления содержимого базы данных выглядит следующим образом:

Вот результат.

Пример вывода:

  ...   ...  ...  

, где отображение схемы такое же, как указано выше.

В качестве примера использования вывода, созданного этими функциями, показана таблица стилей XSLT, которая преобразует вывод table_to_xml_and_xmlschema в HTML-документ, содержащий табличное представление данных таблицы. Аналогичным образом результаты этих функций могут быть преобразованы в другие форматы на основе XML.

Оцените статью
nanomode.ru
Добавить комментарий