Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / загрузка данных из "кривоватых" XML-полей / 13 сообщений из 13, страница 1 из 1
28.04.2015, 09:03
    #38946810
загрузка данных из "кривоватых" XML-полей
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
28.04.2015, 12:50
    #38947147
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка данных из "кривоватых" XML-полей
Честный чайник,

Код: 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
28.04.2015, 13:39
    #38947225
загрузка данных из "кривоватых" XML-полей
Mark Barinstein, большое спасибо.
А есть где-нибудь описание этих секретных подстановок, чтобы понимать, чего оно делает? А то от хелпа по XMLTable только вопросы дополнительный возникают.
...
Рейтинг: 0 / 0
28.04.2015, 14:32
    #38947335
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка данных из "кривоватых" XML-полей
Честный чайник,

XMLTABLE by example, Part 1: Retrieving XML data in relational format
См. про XMLTABLE with Namespaces.
Это W3C XML стандарт, и полное описание всех возможностей надо смотреть там.
...
Рейтинг: 0 / 0
07.05.2015, 07:27
    #38953203
загрузка данных из "кривоватых" XML-полей
Не унимаются эти высокопрофессиональные творческие люди.
Всего-то и добавили, перед корневым тэгом "СведенияОЛицах" текст "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
07.05.2015, 09:52
    #38953272
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка данных из "кривоватых" XML-полей
Честный чайник,

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

Как получить ID и VALUE для FIO? Пробовал различные вариации xmlquery, db2 выдает ошибки 10505, 10507
...
Рейтинг: 0 / 0
02.06.2015, 10:04
    #38974011
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка данных из "кривоватых" XML-полей
гость_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
03.06.2015, 23:50
    #38975748
гость_12345
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка данных из "кривоватых" XML-полей
Mark Barinstein,
спасибо, работает!
...
Рейтинг: 0 / 0
19.07.2015, 21:08
    #39010844
Гость_12345
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
загрузка данных из "кривоватых" XML-полей
Ребята, снова к вам за помощью! Есть ли в db2 функция, которая "суммирует" текстовые поля, например:
Код: plaintext
1.
2.
3.
city	name
Москва	Иванов
Москва	Петров
Питер	Сидоров

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

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


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