Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Парсинг XML Postgres / 7 сообщений из 7, страница 1 из 1
17.09.2021, 09:01
    #40098192
gigaziv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг XML Postgres
Уважаемые добрый день! Влю голову сломал.
В SQL Server все нормально с парсингом вот пример

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
DECLARE @xml XML;
SET @xml =
'
<a id_file="9965_99" version="4.1.0">
  <b>
    <bbb name_code="note"/>
  </b>
  <c id="d000fe02-bd80-46ac-8d60-afdf3e194f90">
    <f ddd="test1" />
    <r rrr="1" />
  </c>
  <c id="d000fe02-bd80-46ac-8d60-afdf3e194f91">
    <f ddd="test2" />
    <r rrr="2" />
  </c>
  <c id="d0t0fe02-bd80-46ac-8d60-afdf3e194f92">
    <f ddd="test3" />
    <r rrr="3" />
  </c>
</a>
'

SELECT 
	T2.Loc.value('(//@id_file)[1]', 'varchar(100)')				AS [id_file],
	T2.Loc.value('(//@version)[1]', 'varchar(100)')				AS [version],
	T2.Loc.value('(//bbb/@name_code)[1]', 'varchar(100)')		AS [name_code],
	T2.Loc.value('(//@id)[1]', 'varchar(500)')				AS [id],
	T2.Loc.value('(f/@ddd)[1]', 'varchar(500)')			AS [ddd],
	T2.Loc.value('(r/@rrr)[1]', 'varchar(500)')			AS [rrr]
FROM @xml.nodes('//c') as T2(Loc)




Тоже самое в Postgres

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
    with cte as (SELECT 
     '<a id_file="9965_99" version="4.1.0">
      <b>
        <bbb name_code="note"/>
      </b>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f90">
        <f ddd="test1" />
        <r rrr="1" />
      </c>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f91">
        <f ddd="test2" />
        <r rrr="2" />
      </c>
      <c id="d0t0fe02-bd80-46ac-8d60-afdf3e194f92">
        <f ddd="test3" />
        <r rrr="3" />
      </c>
    </a>' ::xml)
    SELECT 
    (xpath('//@id_file', xt))[1] as col1,
    (xpath('//@version', xt))[1] as col2,
    (xpath('//b/@bbb', xt))[1] as col3,
    (xpath('//bbb/@name_code', xt))[1] as col7, 
    (xpath('@id', xt))[1] as col4,
    (xpath('f/@ddd', xt))[1] as col5,
    (xpath('r/@rrr', xt))[1] as col6
    from cte
    cross join unnest(xpath('*', xml)) as xt;



И вот 2 результата на картинке. не могу в PS выбрать атрибуты у ноды <a>

Буду рад, если носом ткнете что делаю не так. Спасибо!
...
Рейтинг: 0 / 0
17.09.2021, 09:46
    #40098212
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг XML Postgres
Вариант из MSSQL выглядит странным. Вроде выбираем ноды //c, а в результате имеем атрибут из совсем другого элемента.

Наверное, T2.Loc в варианте MSSQL - это весь документ. Тогда и в Постгресе надо весь документ просматривать. И XPath писать аналогичный. Что-то типа
Код: plsql
1.
(xpath('//@id_file[1]', xml)) as col1,
...
Рейтинг: 0 / 0
17.09.2021, 10:46
    #40098230
gigaziv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг XML Postgres
Alexander A. Sak,

так не работает
...
Рейтинг: 0 / 0
17.09.2021, 11:06
    #40098245
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг XML Postgres
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
with cte as (SELECT 
     '<a id_file="9965_99" version="4.1.0">
      <b>
        <bbb name_code="note"/>
      </b>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f90">
        <f ddd="test1" />
        <r rrr="1" />
      </c>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f91">
        <f ddd="test2" />
        <r rrr="2" />
      </c>
      <c id="d0t0fe02-bd80-46ac-8d60-afdf3e194f92">
        <f ddd="test3" />
        <r rrr="3" />
      </c>
    </a>' ::xml)
    SELECT 
    (xpath('//@id_file', xml))[1] as col1,
    (xpath('//@version', xml))[1] as col2,
    (xpath('//bbb/@name_code', xml))[1] as col3,
    (xpath('//@id', xt))[1] as col4,
    (xpath('*/f/@ddd', xt))[1] as col5,
    (xpath('*/r/@rrr', xt))[1] as col6   
    from cte
    cross join unnest(xpath('a/c', xml)) as xt;


  col1   | col2  | col3 |                 col4                 | col5  | col6 
---------+-------+------+--------------------------------------+-------+------
 9965_99 | 4.1.0 | note | d000fe02-bd80-46ac-8d60-afdf3e194f90 | test1 | 1
 9965_99 | 4.1.0 | note | d000fe02-bd80-46ac-8d60-afdf3e194f91 | test2 | 2
 9965_99 | 4.1.0 | note | d0t0fe02-bd80-46ac-8d60-afdf3e194f92 | test3 | 3
(3 rows)



основной момент в unnest(xpath('a/c', xml))
было
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
postgres=# with cte as (SELECT 
     '<a id_file="9965_99" version="4.1.0">
      <b>
        <bbb name_code="note"/>
      </b>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f90">
        <f ddd="test1" />
        <r rrr="1" />
      </c>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f91">
        <f ddd="test2" />
        <r rrr="2" />
      </c>
      <c id="d0t0fe02-bd80-46ac-8d60-afdf3e194f92">
        <f ddd="test3" />
        <r rrr="3" />
      </c>
    </a>' ::xml)
    SELECT 
    unnest(xpath('*', xml))
    from cte;
                       unnest                        
-----------------------------------------------------
 <a id_file="9965_99" version="4.1.0">              +
       <b>                                          +
         <bbb name_code="note"/>                    +
       </b>                                         +
       <c id="d000fe02-bd80-46ac-8d60-afdf3e194f90">+
         <f ddd="test1"/>                           +
         <r rrr="1"/>                               +
       </c>                                         +
       <c id="d000fe02-bd80-46ac-8d60-afdf3e194f91">+
         <f ddd="test2"/>                           +
         <r rrr="2"/>                               +
       </c>                                         +
       <c id="d0t0fe02-bd80-46ac-8d60-afdf3e194f92">+
         <f ddd="test3"/>                           +
         <r rrr="3"/>                               +
       </c>                                         +
     </a>

[color=red](1 row)[/color]



стало
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
postgres=# with cte as (SELECT 
     '<a id_file="9965_99" version="4.1.0">
      <b>
        <bbb name_code="note"/>
      </b>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f90">
        <f ddd="test1" />
        <r rrr="1" />
      </c>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f91">
        <f ddd="test2" />
        <r rrr="2" />
      </c>
      <c id="d0t0fe02-bd80-46ac-8d60-afdf3e194f92">
        <f ddd="test3" />
        <r rrr="3" />
      </c>
    </a>' ::xml)
    SELECT 
    unnest(xpath('a/c', xml))
    from cte;
                    unnest                     
-----------------------------------------------
 <c id="d000fe02-bd80-46ac-8d60-afdf3e194f90">+
         <f ddd="test1"/>                     +
         <r rrr="1"/>                         +
       </c>
 <c id="d000fe02-bd80-46ac-8d60-afdf3e194f91">+
         <f ddd="test2"/>                     +
         <r rrr="2"/>                         +
       </c>
 <c id="d0t0fe02-bd80-46ac-8d60-afdf3e194f92">+
         <f ddd="test3"/>                     +
         <r rrr="3"/>                         +
       </c>

[color=red](3 rows)[/color]
...
Рейтинг: 0 / 0
17.09.2021, 11:11
    #40098249
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг XML Postgres
А так?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
 with cte as (SELECT 
     '<a id_file="9965_99" version="4.1.0">
      <b>
        <bbb name_code="note"/>
      </b>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f90">
        <f ddd="test1" />
        <r rrr="1" />
      </c>
      <c id="d000fe02-bd80-46ac-8d60-afdf3e194f91">
        <f ddd="test2" />
        <r rrr="2" />
      </c>
      <c id="d0t0fe02-bd80-46ac-8d60-afdf3e194f92">
        <f ddd="test3" />
        <r rrr="3" />
      </c>
    </a>' ::xml)
    SELECT (xpath('//@id_file[1]', xml)) as id_file,
    (xpath('//@version[1]', xml)) as version,
    (xpath('//bbb/@name_code[1]', xml)) as name_code, 
    (xpath('@id', xt)) as id,
    (xpath('f/@ddd[1]', xt)) as ddd,
    (xpath('r/@rrr[1]', xt)) as rrr
    from cte cross join unnest(xpath('//c', xml)) as xt;



id_fileversionname_codeiddddrrr9965_994.1.0noted000fe02-bd80-46ac-8d60-afdf3e194f90test119965_994.1.0noted000fe02-bd80-46ac-8d60-afdf3e194f91test229965_994.1.0noted0t0fe02-bd80-46ac-8d60-afdf3e194f92test33
...
Рейтинг: 0 / 0
17.09.2021, 11:36
    #40098258
gigaziv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг XML Postgres
Guzya,

Огромное спасибо!
Прям мужик, вот прям человечище!!
...
Рейтинг: 0 / 0
17.09.2021, 11:36
    #40098259
gigaziv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг XML Postgres
Alexander A. Sak,

Дай бог тебе красивых женщин и здоровья!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Парсинг XML Postgres / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]