Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 загрузка данных из "кривоватых" XML-полей  [new]
Честный чайник
Member

Откуда:
Сообщений: 91
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 понимать отказывается, что не удивительно.
28 апр 15, 09:03    [17573376]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Честный чайник,

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
 --------
 Иванов
28 апр 15, 12:50    [17574925]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Честный чайник
Member

Откуда:
Сообщений: 91
Mark Barinstein, большое спасибо.
А есть где-нибудь описание этих секретных подстановок, чтобы понимать, чего оно делает? А то от хелпа по XMLTable только вопросы дополнительный возникают.
28 апр 15, 13:39    [17575295]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Честный чайник,

XMLTABLE by example, Part 1: Retrieving XML data in relational format
См. про XMLTABLE with Namespaces.
Это W3C XML стандарт, и полное описание всех возможностей надо смотреть там.
28 апр 15, 14:32    [17575704]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Честный чайник
Member

Откуда:
Сообщений: 91
Не унимаются эти высокопрофессиональные творческие люди.
Всего-то и добавили, перед корневым тэгом "СведенияОЛицах" текст "pfrmid:".

<?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</ДатаРождения>
....

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

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 и, наверное, будет счастье, но, боюсь, они полны творческих планов и это далеко не последнее изменение.
7 май 15, 07:27    [17610534]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Честный чайник,

Всё то же самое должно работать.
Если вы явно указываете в своем выражении XPath имя пространства, то вы должны описать его в XMLNAMESPACES.
+ Пример
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
7 май 15, 09:52    [17610962]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Честный чайник
Member

Откуда:
Сообщений: 91
Виноват. Разобрался. Изменения внутри XML не сказались на возможности трактовать его в виде таблицы. Конструкция *:тэг работает и на таком тоже.
Формат имени файла, из которого тоже несколько полей бралось, тоже поменяли, в результате запрос не проходил.
12 май 15, 08:48    [17627072]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
гость_12345
Guest
Ребята, помогите пожалуйста! Задача как у Честного чайника, только элементы в xml содержат атрибуты и надо вытащить именно атрибуты, например,
<Client>
<FIO ID=1001 VALUE=ИВАНОВ> </FIO>
<Adress ID=2001 VALUE=....> </Adress>
</Client>

Как получить ID и VALUE для FIO? Пробовал различные вариации xmlquery, db2 выдает ошибки 10505, 10507
1 июн 15, 23:56    [17718020]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
гость_12345,

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
2 июн 15, 10:04    [17718662]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
гость_12345
Guest
Mark Barinstein,
спасибо, работает!
3 июн 15, 23:50    [17727899]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Гость_12345
Guest
Ребята, снова к вам за помощью! Есть ли в db2 функция, которая "суммирует" текстовые поля, например:

city name
Москва Иванов
Москва Петров
Питер Сидоров

делаем group by city и получаем:

city name
Москва Иванов, Петров
Питер Сидоров
19 июл 15, 21:08    [17910436]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Гость_12345,

listagg
20 июл 15, 09:36    [17911376]     Ответить | Цитировать Сообщить модератору
 Re: загрузка данных из "кривоватых" XML-полей  [new]
Гость_12345
Guest
Mark Barinstein,
спасибо!
20 июл 15, 20:46    [17914712]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить