powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / считать XML из таблицы
11 сообщений из 11, страница 1 из 1
считать XML из таблицы
    #40110571
user_t0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть табличка с 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
считать XML из таблицы
    #40110653
user_t0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или постгрес так не умеет и только как текст парсить?
...
Рейтинг: 0 / 0
считать XML из таблицы
    #40110686
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
считать XML из таблицы
    #40110692
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
считать XML из таблицы
    #40110701
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибся
...
Рейтинг: 0 / 0
считать XML из таблицы
    #40110704
user_t0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
считать XML из таблицы
    #40110705
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
...
Рейтинг: 0 / 0
считать XML из таблицы
    #40110707
user_t0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
считать XML из таблицы
    #40110714
yens_gjytk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user_t0,

У Вас видимо какая-то древняя версия PG. Ну попробуйте BY REF тогда или функцию xpath_exists, а лучше почитайте уже документацию
...
Рейтинг: 0 / 0
считать XML из таблицы
    #40110723
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.
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
считать XML из таблицы
    #40110766
user_t0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guzya,

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


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