Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / считать XML из таблицы / 11 сообщений из 11, страница 1 из 1
10.11.2021, 10:31
    #40110571
user_t0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
Добрый день.

Есть табличка с XML.

XML там вот такого формата:

Код: sql
1.
2.
3.
4.
5.
6.
7.
<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>




Подскажите пожалуйста как вывести поле code="command_Enter" или хотя бы проверить что оно есть?



Для удобства вставил в CTE (сейчас не выводит)





Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH tbl(p_xml) AS (  
   SELECT 

   '<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>'::xml


    )  
SELECT xpath('/zMenu/menu/command/@code', p_xml)
FROM   tbl;
...
Рейтинг: 0 / 0
10.11.2021, 13:18
    #40110653
user_t0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
Или постгрес так не умеет и только как текст парсить?
...
Рейтинг: 0 / 0
10.11.2021, 14:08
    #40110686
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
postgres=# WITH tbl(p_xml) AS (  
   SELECT 
   '<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>'::xml
    )  
SELECT xpath('//@code', p_xml)
FROM   tbl;
                   xpath                   
-------------------------------------------
 {command_Type,command_Info,command_Enter}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
postgres=# WITH tbl(p_xml) AS (  
   SELECT 
   '<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>'::xml
    )  
SELECT unnest(xpath('//@code', p_xml))
FROM   tbl;
    unnest     
---------------
 command_Type
 command_Info
 command_Enter
(3 rows)
...
Рейтинг: 0 / 0
10.11.2021, 14:12
    #40110692
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
Извиняюсь, плохо посмотрел вопрос.

Решение в лоб

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
postgres=# WITH tbl(p_xml) AS (  
   SELECT 
   '<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>'::xml
    )  
select * from (SELECT unnest(xpath('//@code', p_xml))::text as code
FROM   tbl) as txml where txml.code='command_Enter';

     code      
---------------
 command_Enter
...
Рейтинг: 0 / 0
10.11.2021, 14:27
    #40110701
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
Ошибся
...
Рейтинг: 0 / 0
10.11.2021, 14:34
    #40110704
user_t0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
Guzya
Извиняюсь, плохо посмотрел вопрос.

Решение в лоб

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
postgres=# WITH tbl(p_xml) AS (  
   SELECT 
   '<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>'::xml
    )  
select * from (SELECT unnest(xpath('//@code', p_xml))::text as code
FROM   tbl) as txml where txml.code='command_Enter';

     code      
---------------
 command_Enter




О, спасибо!

Решение рабочее и оно подходит!



А без подзапроса получается нельзя вытащить? (чисто теоретически)
...
Рейтинг: 0 / 0
10.11.2021, 14:38
    #40110705
yens_gjytk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
user_t0,

Проверить существование можно и без подзапроса
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT xmlexists('//@code'
PASSING BY VALUE '<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>');



https://postgrespro.ru/docs/postgresql/12/functions-xml
...
Рейтинг: 0 / 0
10.11.2021, 14:43
    #40110707
user_t0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
yens_gjytk
user_t0,

Проверить существование можно и без подзапроса
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT xmlexists('//@code'
PASSING BY VALUE '<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>');



https://postgrespro.ru/docs/postgresql/12/functions-xml




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
ОШИБКА:  ошибка синтаксиса (примерное положение: "VALUE")
LINE 2: PASSING BY VALUE '<zMenu xsi:schemaLocation="http://www.exam...
                   ^

********** Ошибка **********

ОШИБКА: ошибка синтаксиса (примерное положение: "VALUE")
SQL-состояние: 42601
Символ: 39
...
Рейтинг: 0 / 0
10.11.2021, 14:50
    #40110714
yens_gjytk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
user_t0,

У Вас видимо какая-то древняя версия PG. Ну попробуйте BY REF тогда или функцию xpath_exists, а лучше почитайте уже документацию
...
Рейтинг: 0 / 0
10.11.2021, 14:59
    #40110723
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать 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.
postgres=# WITH tbl(p_xml) AS (  
   SELECT 
   '<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>'::xml
    )  
SELECT xmlexists('//*[@code=''command_Ente'']' PASSING by ref p_xml)
FROM   tbl;
 xmlexists 
-----------
 f
(1 row)

postgres=# WITH tbl(p_xml) AS (  
   SELECT 
   '<zMenu xsi:schemaLocation="http://www.example.org/menu menu.xsd " xmlns="http://www.example.org/menu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <menu name="Затраты" id="1">
    <command name="Тип затрат" code="command_Type" id="1"/>
    <command name="Информация по затратам" code="command_Info" id="2"/>
    <command name="Ввод затрат" code="command_Enter" id="3"/>
  </menu>
</zMenu>'::xml
    )  

SELECT xmlexists('//*[@code=''command_Enter'']' PASSING by ref p_xml)
FROM   tbl;

 xmlexists 
-----------
 t
(1 row)
...
Рейтинг: 0 / 0
10.11.2021, 15:55
    #40110766
user_t0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
считать XML из таблицы
Guzya,

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


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