powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Парсинг XML Postgres
7 сообщений из 7, страница 1 из 1
Парсинг XML Postgres
    #40098192
gigaziv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые добрый день! Влю голову сломал.
В 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
Парсинг XML Postgres
    #40098212
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант из MSSQL выглядит странным. Вроде выбираем ноды //c, а в результате имеем атрибут из совсем другого элемента.

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

так не работает
...
Рейтинг: 0 / 0
Парсинг XML Postgres
    #40098245
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Парсинг XML Postgres
    #40098249
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?

Код: 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
Парсинг XML Postgres
    #40098258
gigaziv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guzya,

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

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


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