xml2

Функции для выполнения запросов XPath и преобразований XSLT.
Схема размещения: ext.
Модуль предоставляет функции для проверки соответствия синтаксису xml, а также методы для выполнения запросов XPath и преобразований XSLT.

Использование модуля

Подробное описание функций, которые предоставляются модулем xml2, приведены в документации: https://www.postgresql.org/docs/13/xml2.html.
Ниже рассмотрены примеры работы с функцией xpath_table, которая рассчитана на случаи, когда каждый запрос XPath может вернуть набор данных. Количество возвращенных этой функцией строк может не совпадать с количеством входных документов. В первой строке возвращается первый результат каждого запроса, во второй — второй результат и так далее. Если один из запросов возвращает меньше значений, чем другие, вместо недостающих значений будет возвращаться NULL.
В некоторых случаях пользователь знает, что запрос XPath вернет только один результат (возможно, уникальный идентификатор документа) — если он используется рядом с запросом XPath, возвращающим несколько результатов, результат с одним значением будет выведен только в первой выходной строке.
Чтобы исправить это, можно воспользоваться полем ключа и соединить результат с более простым запросом XPath.
Пример:
CREATE TABLE test (
    id int PRIMARY KEY,
    xml text

INSERT INTO test VALUES (1, '<doc num="C1">
<line num="L1"><a>1</a><b>2</b><c>3</c></line>
<line num="L2"><a>11</a><b>22</b><c>33</c></line>
</doc>');


INSERT INTO test VALUES (2, '<doc num="C2">
<line num="L1"><a>111</a><b>222</b><c>333</c></line>
<line num="L2"><a>111</a><b>222</b><c>333</c></line>
</doc>');

SELECT * FROM
  xpath_table('id','xml','test',
              '/doc/@num|/doc/line/@num|/doc/line/a|/doc/line/b|/doc/line/c',
              'true')
  AS t(id int, doc_num varchar(10), line_num varchar(10), val1 int, val2 int, val3 int)
WHERE id = 1 ORDER BY doc_num, line_num;
Пример вывода результата выполнения запроса:
Раскрыть type=sql
 id | doc_num | line_num | val1 | val2 | val3 
----+---------+----------+------+------+------
  1 | C1      | L1       |    1 |    2 |    3
  1 |         | L2       |   11 |   22 |   33
(2 rows)
Чтобы получить doc_num в каждой строке, можно вызывать xpath_table дважды и соединить результаты:
SELECT t.*,i.doc_num FROM
  xpath_table('id', 'xml', 'test',
              '/doc/line/@num|/doc/line/a|/doc/line/b|/doc/line/c',
              'true')
    AS t(id int, line_num varchar(10), val1 int, val2 int, val3 int),
  xpath_table('id', 'xml', 'test', '/doc/@num', 'true')
    AS i(id int, doc_num varchar(10))
WHERE i.id=t.id AND i.id=1
ORDER BY doc_num, line_num;
Пример вывода результата выполнения запроса:
Раскрыть type=sql
 id | line_num | val1 | val2 | val3 | doc_num 
----+----------+------+------+------+---------
  1 | L1       |    1 |    2 |    3 | C1
  1 | L2       |   11 |   22 |   33 | C1
(2 rows)

Ссылки на документацию разработчика

Дополнительную информацию по поставляемому модулю xml2 можно получить по ссылке.
Предыдущий раздел
wal2json
Следующий раздел
Часто встречающиеся проблемы и пути их устранения
Была ли страница полезной?