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=sqlid | 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=sqlid | line_num | val1 | val2 | val3 | doc_num ----+----------+------+------+------+--------- 1 | L1 | 1 | 2 | 3 | C1 1 | L2 | 11 | 22 | 33 | C1 (2 rows)
Дополнительную информацию по поставляемому модулю xml2 можно получить по ссылке.