powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / XMLforest with multiple elems
5 сообщений из 5, страница 1 из 1
XMLforest with multiple elems
    #39747293
bishnike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня заядлым форумчанам!

Прошу помощи.
При сериализации объектов БД в XML столкнулся с такой проблемойособенностью:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Простое вложение отдает то что нужно
select
  XMLforest(
    XMLforest(
      'sometext' as "elem"
    ) as "root"
  )::text as example

Вывод:
<root>
  <elem>sometext</elem>
</root>

Подскажите как быть с множественной вложенностью?
<root>
  <elem>sometext1</elem>
  <elem>sometext2</elem>
</root>


Если использовать XMLelement то почти всё ок
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select
  XMLelement(name "root",
    (
      select
        XMLagg(
          XMLelement(name "elem",
            t.str
          )
        )
      from (
        select 'sometext1' as str union all
        select 'sometext2' as str
      ) as t
      where 1 = 0
    )
  )::text

Вывод:
<root/>


Почти потому что необходимо исключить "self-closing" тэги из результатов.

"Кто мне подскажет, кто расскажет?! Где она, где она?!" (с)
...
Рейтинг: 0 / 0
XMLforest with multiple elems
    #39747356
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bishnike,

Как то так ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select x::text from (
      select
        XMLelement(name "root",XMLagg(
          XMLelement(name "elem",
            t.str
          )
        )
       ) as x
      from (
        select 'sometext1' as str union all
        select 'sometext2' as str
      ) as t
      where 1 = 0
  ) t
where 
 xmlexists ('//root/elem' passing x by ref)
...
Рейтинг: 0 / 0
XMLforest with multiple elems
    #39747394
bishnike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111,

спасибо за ответ

Судя по всему не совсем то что нужно.
Если применить ваше решение то не учтено что у root-элемента могут быть другие непустые вложенные элементы.

Код: 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.
select * 
from (
select
  XMLelement(name "root",
    (
      select
        XMLagg(
          XMLelement(name "elem",
            t.str
          )
        )
      from (
        select 'sometext1' as str union all
        select 'sometext2' as str
      ) as t
      where 1 = 0
    ),
    (
      select
        XMLagg(
          XMLelement(name "other_elem",
            t.str
          )
        )
      from (
        select 'othertext1' as str union all
        select 'othertext2' as str
      ) as t
      where 1 = 1
    )
  ) as x

) as t
where 
  xmlexists ('//root/elem' passing x by ref)



В моих примерах я постарался упростить чтоб донести суть.
В реальной задаче структура корневого элемента сложнее, в нее вложены как одиночные тэги так и множественные.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<root>
  <s1>someId</s1>
  <inner_root>
    <elem>someText1</elem>
    <elem>someText2</elem>
    <elem>someText3</elem>
    <other_elem>otherText1</other_elem>
    <other_elem>otherText2</other_elem>
    <other_elem>otherText3</other_elem>
  </inner_root>
</root>


условие на "xmlexists - inner_root/elem" не будет учитывать что в "inner_root" есть непустые "other_elem".
...
Рейтинг: 0 / 0
XMLforest with multiple elems
    #39747404
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bishnike,

Тогда строка поиска будет
Код: plsql
1.
'//root/*'



Еще можно сделать свою хранимую процедуру которая будет проверять xml элемент на пустоту и возвращать null если он self-closing, в противном случае сам XML документ.
...
Рейтинг: 0 / 0
XMLforest with multiple elems
    #39747468
bishnike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111,

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


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