Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / XMLforest with multiple elems / 5 сообщений из 5, страница 1 из 1
13.12.2018, 12:22
    #39747293
bishnike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XMLforest with multiple elems
Доброго дня заядлым форумчанам!

Прошу помощи.
При сериализации объектов БД в 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
13.12.2018, 13:42
    #39747356
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XMLforest with multiple elems
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
13.12.2018, 14:20
    #39747394
bishnike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XMLforest with multiple elems
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
13.12.2018, 14:26
    #39747404
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XMLforest with multiple elems
bishnike,

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



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

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


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