:: Не фоксом единым
Oracle разбор XML
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Предположим, есть XML файл. хочется из него вытащить данные. Выглядит примерно так:

with sss as
(select xmltype(
'<cust>
<request>
<reqID>eff44173-fa3c-4cee-a2f9-93b600e32482</reqID>
<BranchId>2000</BranchId>
</request>
</cust>') xml from dual
) select t.xml.extract('cust/request/reqID/text()').getStringVal() AS "reqID",
t.xml.extract('cust/request/BranchId/text()').getStringVal() AS "BranchId"
from sss t
Ratings: 0 negative/0 positive
Re: Oracle разбор XML
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Есть другие XML:

with sss as
(select xmltype(
'<q0:cust>
<q0:request>
<q1:reqID>eff44173-fa3c-4cee-a2f9-93b600e32482</q1:reqID>
<q1:BranchId>2000</q1:BranchId>
</q0:request>
</q0:cust>') xml from dual
) select t.xml.extract('q0:cust/q0:request/q1:reqID/text()').getStringVal() AS "reqID" from sss t
Так не работает, ругается:

Цитата:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00234: namespace prefix "q0" is not declared
Error at line 1
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
Ratings: 0 negative/0 positive
Re: Oracle разбор XML
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Проблему решил так:

with sss as
(select xmltype(replace(replace(
'<q0:cust>
<q0:request>
<q1:reqID>eff44173-fa3c-4cee-a2f9-93b600e32482</q1:reqID>
<q1:BranchId>2000</q1:BranchId>
</q0:request>
</q0:cust>','q0:',''),'q1:','')) xml from dual
) select t.xml.extract('cust/request/reqID/text()').getStringVal() AS "reqID" from sss t

Но, как то это всё неправильно...
Господа. Пожалуйста, подскажите - есть какой то другой метод, как распарсить подобный XML без replac-а?
Ratings: 0 negative/0 positive
Re: Oracle разбор XML
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Если "распарсить" в данном случае понимается как "загрузить данные из XML-файла в таблицу" - то есть XMLTOCURSOR() и XMLADAPTER, примеров по ним на форуме много.




------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Oracle разбор XML
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Нет, в таблицу не надо. И, вопрос не по VFP
Ratings: 0 negative/0 positive
Re: Oracle разбор XML
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
То есть работа с чистым Oracle, без VFP-клиента? Хм.. понятно.


Попробуй так:

select t1.reqID, t1.BranchId
from xmltable(
'/q0:cust/q0:request'
passing xmltype('
<q0:cust>
<q0:request>
<q1:reqID>eff44173-fa3c-4cee-a2f9-93b600e32482</q1:reqID>
<q1:BranchId>2000</q1:BranchId>
</q0:request>
</q0:cust>
')
columns
"reqID" string path 'q0:request',
"BranchId" string path 'q1:BranchId'
) t1


------------------
"Veni, vidi, vici!"(с)




Исправлено 3 раз(а). Последнее : sphinx, 13.05.16 22:44
Ratings: 0 negative/0 positive
Re: Oracle разбор XML
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Или посмотри здесь идею на основе XMLSequence




------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Oracle разбор XML
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
Так не работает, ругается:
Цитата:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00234: namespace prefix "q0" is not declared
Error at line 1
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at line 1
Правильно ругается - q0 в таком xml-е это просто АЛИАС, краткое обозначение пространства имён, которому принадлежит соответствующий элемент (узел или атрибут). Само пространство имён это URI типа хттп://www.w3.org/TR/html4/ или там хттп://mycompany.ru
Поскольку писать это безобразие в каждом элементе xml нецелесообразно, придуманы эти самые префиксы/алиасы. В некотором узле пишется что дескать начиная с него и внутри считать q0 за хттп://mycompany.ru - и далее уже идентификаторы пишутся кратенько - как у тебя в примере q0:request
Есть ещё такая забавная штука как пространство имён по умолчанию - т.е. даже просто cust из твоего первого примера это не просто cust, а cust из некоторого пространства имён (если оно заданно при помощи xmlns="хттп://чего-то-там")

В XML парсерах существует понятие SelectionNamespaces - это как раз список пространств имён и соответствующих алиасов используемых в запросе. Синтаксис задания таковых как правило совпадает с собственно определением пространств имён в XML-ях, т.е. это строка вида xmlns:q0="хттп://mycompany.ru"
В более менее свежем оракле пространства имён поддерживаются - это в частности второй параметр метода extract (точнее это 2-й параметр 2-й перегрузки этого метода ). Есть это и в других подобных методах типа XMLType и в "плоских SQL-ных" функциях, скажем EXTRACT().
В любом случае твой XML не будет корректным до тех пор пока там не появятся указания для "расшифровки" префиксов q0, q1 - а как только они появятся, ты уже сможешь и XPath писать с нужным уточнением

P.S. Вариант с функцией XMLTable имеет право на жизнь, но и там никуда не деться от пространств имён При том задаются они там несколько по другому


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Oracle разбор XML
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
При указании параметра namespace (функции extract) запрос стал работать.

Igor, спасибо за подсказку.
Ratings: 0 negative/0 positive
Re: Oracle разбор XML
sphinx
Автор

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
S-type
При указании параметра namespace

Ну, мне тоже пригодится.

Игорю :hi:


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 12 (Гостей: 12)

© 2000-2024 Fox Club 
Яндекс.Метрика