Парсинг множественных тэгов XML в Postgres
От: irbis3003  
Дата: 14.03.19 09:59
Оценка:
Добрый день!

При парсинге xml столкнулся с проблемой разбора множественных тэгов. Т.е. единичные возвращаются корректно, а если тэг повторяется — не происходит умножения данных (как я предполагал), а возвращается ошибка
"21000 выражение XPath, отбирающее столбец, возвратило более одного значения".

Данные лежат в таблице, фрагмент xml (точки для наглядного форматирования, еслифчто ):

<head>
......<folder>
..............<folder_id>1</folder_id>
..............<tag1>0<tag1>
..............<tag1>1<tag1>
..............<tag1>2<tag1>
......</folder>
</head>



скрипт:

select s.*
from test.t_files f,
    xmltable('//head/folder' passing cast(f.filedata as xml)
    columns
        folder_id integer path 'folder_id',
        tag1 integer path 'tag1'
) s


На выходе хочется получить:

folder_id tag1
1 0
1 1
1 2
В документации не нашел про множественные тэги ничего.

Как скорректировать скрипт?
Re: Парсинг множественных тэгов XML в Postgres
От: LuciferNovoros Россия  
Дата: 16.03.19 13:15
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>скрипт:


I>
I>select s.*
I>from test.t_files f,
I>    xmltable('//head/folder' passing cast(f.filedata as xml)
I>    columns
I>        folder_id integer path 'folder_id',
I>        tag1 integer path 'tag1'
I>) s
I>


Предыдущий ответ неверен. Проверил уже. Надо как-то так:
DO
    $$DECLARE xml_string xml;
BEGIN

select t_files into xml_string from test;

drop table if exists tmp_table;

create table tmp_table as
    select 
      unnest(xpath('//folder_id/text()', xml_string)) as folder_id,
      unnest(xpath('//tag1/text()', xml_string)) as tag;

END$$;

select * from tmp_table;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.