Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 считать XML из таблицы  [new]
user_t0
Member

Откуда:
Сообщений: 60
Добрый день.

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

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

<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 (сейчас не выводит)





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;


Сообщение было отредактировано: 10 ноя 21, 10:32
10 ноя 21, 10:31    [22394038]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
user_t0
Member

Откуда:
Сообщений: 60
Или постгрес так не умеет и только как текст парсить?
10 ноя 21, 13:18    [22394146]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
Guzya
Member

Откуда:
Сообщений: 818
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}


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)
10 ноя 21, 14:08    [22394184]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
Guzya
Member

Откуда:
Сообщений: 818
Извиняюсь, плохо посмотрел вопрос.

Решение в лоб

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


Сообщение было отредактировано: 10 ноя 21, 14:16
10 ноя 21, 14:12    [22394192]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
Guzya
Member

Откуда:
Сообщений: 818
Ошибся

Сообщение было отредактировано: 10 ноя 21, 14:30
10 ноя 21, 14:27    [22394208]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
user_t0
Member

Откуда:
Сообщений: 60
Guzya
Извиняюсь, плохо посмотрел вопрос.

Решение в лоб

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



О, спасибо!

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



А без подзапроса получается нельзя вытащить? (чисто теоретически)
10 ноя 21, 14:34    [22394212]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
yens_gjytk
Member

Откуда: Samara/Saratov
Сообщений: 81
user_t0,

Проверить существование можно и без подзапроса
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
10 ноя 21, 14:38    [22394213]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
user_t0
Member

Откуда:
Сообщений: 60
yens_gjytk
user_t0,

Проверить существование можно и без подзапроса
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




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

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

ОШИБКА: ошибка синтаксиса (примерное положение: "VALUE")
SQL-состояние: 42601
Символ: 39
10 ноя 21, 14:43    [22394216]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
yens_gjytk
Member

Откуда: Samara/Saratov
Сообщений: 81
user_t0,

У Вас видимо какая-то древняя версия PG. Ну попробуйте BY REF тогда или функцию xpath_exists, а лучше почитайте уже документацию
10 ноя 21, 14:50    [22394224]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
Guzya
Member

Откуда:
Сообщений: 818
С проверкой

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)
10 ноя 21, 14:59    [22394236]     Ответить | Цитировать Сообщить модератору
 Re: считать XML из таблицы  [new]
user_t0
Member

Откуда:
Сообщений: 60
Guzya,

Благодарю за помощь!
10 ноя 21, 15:55    [22394284]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить