powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / загрузка данных из "кривоватых" XML-полей
13 сообщений из 13, страница 1 из 1
загрузка данных из "кривоватых" XML-полей
    #38946810
db2 9.7

Завёлся контрагент присылающий подобные XML-файлы:
_____________________________________________________________________

<?xml version="1.0"?>
<СведенияОЛицах xmlns:xsd=" http://www.w3.org/2001/XMLSchema" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" ВерсияXML="1.0.0.0" xmlns=" http://www.pfr.ru/pfrmid" >
<Количество xmlns="">13</Количество>
<Лица xmlns="">
<ЛичныеДанные>
<ФИО>
<Фамилия>...
<Имя>...
<Отчество>...
</Лица>
...
<Лица xmlns="">
_____________________________________________________________________

Соответственно, когда я пишу что-то вроде:
xmltable('$c/СведенияОЛицах/Лица/ЛичныеДанные' passing xml.xml_content as "c"
запрос ничего не возращает, т.к. тэг получается не <Лица> а <Лица xmlns=''> и т.п.

Вопрос: Это я недопонимаю чего-то, и можно каким-то образом загружать игнорируя "хвосты", или придётся допиливать руками XML-файл?

Выражения типа:
_____________________________________________________________________

xmltable('$c/<СведенияОЛицах xmlns:xsd=" http://www.w3.org/2001/XMLSchema" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" ВерсияXML="1.0.0.0" xmlns=" http://www.pfr.ru/pfrmid">/Лица xmlns=""/ЛичныеДанные' passing xml.xml_content as "c"
_____________________________________________________________________
db2 понимать отказывается, что не удивительно.
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #38947147
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Честный чайник,

Код: 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.
with tab(xml_content) as (values
xmlparse(document '<?xml version="1.0"?>
<СведенияОЛицах xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.pfr.ru/pfrmid">
<Количество xmlns="">13</Количество>
<Лица xmlns="">
 <ЛичныеДанные>
  <ФИО>
   <Фамилия>Иванов</Фамилия>
   <Имя>Иван</Имя>
   <Отчество>Иванович</Отчество>
  </ФИО>
 </ЛичныеДанные>
</Лица>
</СведенияОЛицах>'
))
select t.*
from 
  tab xml
, xmltable('$c/*:СведенияОЛицах/*:Лица/ЛичныеДанные/ФИО' passing xml.xml_content as "c"
columns
  LASTNAME VARCHAR(50) PATH 'Фамилия'
) t

 LASTNAME
 --------
 Иванов
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #38947225
Mark Barinstein, большое спасибо.
А есть где-нибудь описание этих секретных подстановок, чтобы понимать, чего оно делает? А то от хелпа по XMLTable только вопросы дополнительный возникают.
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #38947335
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Честный чайник,

XMLTABLE by example, Part 1: Retrieving XML data in relational format
См. про XMLTABLE with Namespaces.
Это W3C XML стандарт, и полное описание всех возможностей надо смотреть там.
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #38953203
Не унимаются эти высокопрофессиональные творческие люди.
Всего-то и добавили, перед корневым тэгом "СведенияОЛицах" текст "pfrmid:".

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="UTF-8"?>
<pfrmid:СведенияОЛицах xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pfrmid="http://www.pfr.ru/pfrmid" xsi:schemaLocation="http://www.pfr.ru/pfrmid pfrmid01.xsd" ВерсияXML="1.0.0.0">
<Количество>2</Количество>
<Лица>
<ЛичныеДанные>
<Гражданство>РОССИЙСКАЯ ФЕДЕРАЦИЯ</Гражданство>
<Пол>Женский</Пол>
<ФИО>
<Фамилия>иванова</Фамилия>
<Имя>Иванна</Имя>
<Отчество>Ивановна</Отчество>
</ФИО>
<ДатаРождения>07.04.1950</ДатаРождения>
....


Соответственно надо как-то исхитриться переписать

Код: plsql
1.
2.
3.
4.
5.
6.
7.
xmltable('$c/*:СведенияОЛицах/*:Лица/ЛичныеДанные' passing xml.xml_content as "c"
columns 
	FFF varchar(99) path 'ФИО/Фамилия',
	III varchar(99) path 'ФИО/Имя',
	OOO varchar(99) path 'ФИО/Отчество',
	b_d char(10) path 'ДатаРождения'
) as x



И теперь варианты
xmltable('$c/pfrmid:СведенияОЛицах/*:Лица/ЛичныеДанные' passing xml.xml_content as "c"
xmltable('$c/*:pfrmid:СведенияОЛицах/*:Лица/ЛичныеДанные' passing xml.xml_content as "c"
не проходят на стадии внедрения хранимой процедуры

xmltable('$c/pfrmid:СведенияОЛицах/*:Лица/ЛичныеДанные' passing xml.xml_content as "c"
с текстом
ZABUGOR.DECODE_ONE_XML - Внедрение для отладки запущено.
При создании хранимая процедура возвращен SQLCODE: -16005, SQLSTATE: 10506.
ZABUGOR.DECODE_ONE_XML: 4: Выражение XQuery ссылается на имя элемента, имя атрибута, имя типа, имя функции, префикс пространства имен или имя переменной "pfrmid", которые не определены в статическом контексте. QName ошибки =err:XPST0008.. SQLCODE=-16005, SQLSTATE=10506, DRIVER=3.63.108
Выражение XQuery ссылается на имя элемента, имя атрибута, имя типа, имя функции, префикс пространства имен или имя переменной "pfrmid", которые не определены в статическом контексте. QName ошибки =err:XPST0008.. SQLCODE=-16005, SQLSTATE=10506, DRIVER=3.63.108
ZABUGOR.DECODE_ONE_XML - Внедрение для отладки завершилось неудачно.
ZABUGOR.DECODE_ONE_XML - Откат выполнен успешно.

xmltable('$c/*:pfrmid:СведенияОЛицах/*:Лица/ЛичныеДанные' passing xml.xml_content as "c"
ZABUGOR.DECODE_ONE_XML - Внедрение для отладки запущено.
При создании хранимая процедура возвращен SQLCODE: -16002, SQLSTATE: 10505.
ZABUGOR.DECODE_ONE_XML: 4: В выражении XQuery найден неожиданный элемент " " после "ћР›РёС†Р°С". Список возможных правильных элементов: "ћР›РёС†Р°С". QName ошибки =err:XPST0003.. SQLCODE=-16002, SQLSTATE=10505, DRIVER=3.63.108
В выражении XQuery найден неожиданный элемент " " после "ћР›РёС†Р°С". Список возможных правильных элементов: "ћР›РёС†Р°С". QName ошибки =err:XPST0003.. SQLCODE=-16002, SQLSTATE=10505, DRIVER=3.63.108
ZABUGOR.DECODE_ONE_XML - Внедрение для отладки завершилось неудачно.
ZABUGOR.DECODE_ONE_XML - Откат выполнен успешно.

Вот именно так с элементами UTF и ругается. Ну оно понятно, как бы 2 пространства имён пытаюсь глупый я указать: любое а потом ещё и pfrmid.

К сожалению, грамотности, чтобы объяснить товарищам, что так делать не нужно, не хватает...
Можно, конечно, выпилить pfrmid и, наверное, будет счастье, но, боюсь, они полны творческих планов и это далеко не последнее изменение.
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #38953272
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Честный чайник,

Всё то же самое должно работать.
Если вы явно указываете в своем выражении XPath имя пространства, то вы должны описать его в XMLNAMESPACES.
Пример
Код: 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.
36.
37.
with tab(xml_content) as (values
xmlparse(document '<?xml version="1.0" encoding="UTF-8"?>
<pfrmid:СведенияОЛицах xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pfrmid="http://www.pfr.ru/pfrmid" xsi:schemaLocation="http://www.pfr.ru/pfrmid pfrmid01.xsd" ВерсияXML="1.0.0.0">
<Количество>2</Количество>
<Лица>
<ЛичныеДанные>
<Гражданство>РОССИЙСКАЯ ФЕДЕРАЦИЯ</Гражданство>
<Пол>Женский</Пол>
<ФИО>
<Фамилия>иванова</Фамилия>
<Имя>Иванна</Имя>
<Отчество>Ивановна</Отчество>
</ФИО>
<ДатаРождения>07.04.1950</ДатаРождения>
</ЛичныеДанные>
</Лица>
</pfrmid:СведенияОЛицах>'
))
select t.*
from 
  tab xml
--, xmltable('$c/*:СведенияОЛицах/Лица/ЛичныеДанные' passing xml.xml_content as "c"
, xmltable(
  XMLNAMESPACES( 
  'http://www.pfr.ru/pfrmid' as "pfrmid"
  )
, '$c/pfrmid:СведенияОЛицах/Лица/ЛичныеДанные' passing xml.xml_content as "c"
columns
    FFF varchar(99) path 'ФИО/Фамилия',
    III varchar(99) path 'ФИО/Имя',
    OOO varchar(99) path 'ФИО/Отчество',
    b_d char(10) path 'ДатаРождения'
) t

 FFF     III    OOO      B_D
 ------- ------ -------- ----------
 иванова Иванна Ивановна 07.04.1950

...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #38956042
Виноват. Разобрался. Изменения внутри XML не сказались на возможности трактовать его в виде таблицы. Конструкция *:тэг работает и на таком тоже.
Формат имени файла, из которого тоже несколько полей бралось, тоже поменяли, в результате запрос не проходил.
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #38973865
гость_12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, помогите пожалуйста! Задача как у Честного чайника, только элементы в xml содержат атрибуты и надо вытащить именно атрибуты, например,
<Client>
<FIO ID=1001 VALUE=ИВАНОВ> </FIO>
<Adress ID=2001 VALUE=....> </Adress>
</Client>

Как получить ID и VALUE для FIO? Пробовал различные вариации xmlquery, db2 выдает ошибки 10505, 10507
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #38974011
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гость_12345,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with tab(xml_content) as (values
xmlparse(document '<Client>
<FIO ID="1001" VALUE="ИВАНОВ"> </FIO>
<Adress ID="2001" VALUE="...."> </Adress>
</Client>'))
select t.*
from 
  tab xml
, xmltable('$c/Client' passing xml.xml_content as "c"
columns
    FIO_ID    INT         path 'FIO/@ID'
,   FIO_VALUE varchar(20) path 'FIO/@VALUE'
,   ADD_ID    INT         path 'Adress/@ID'
,   ADD_VALUE varchar(20) path 'Adress/@VALUE'
) t
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #38975748
гость_12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,
спасибо, работает!
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #39010844
Гость_12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, снова к вам за помощью! Есть ли в db2 функция, которая "суммирует" текстовые поля, например:
Код: plaintext
1.
2.
3.
city	name
Москва	Иванов
Москва	Петров
Питер	Сидоров

делаем group by city и получаем:
Код: plaintext
1.
2.
city    name
Москва  Иванов, Петров
Питер   Сидоров
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #39010969
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гость_12345,

listagg
...
Рейтинг: 0 / 0
загрузка данных из "кривоватых" XML-полей
    #39011722
Гость_12345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,
спасибо!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / загрузка данных из "кривоватых" XML-полей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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