Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки / 25 сообщений из 239, страница 1 из 10
01.11.2005, 15:23
    #33355543
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Добрый день!

Помогите разобраться в разборке XML в Oracle 9i.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>

Есть массив:
v_array_surnames

Как можно вытащить все значения аттбирута с name="SURNAME" сразу в массив? XML у меня типа Xmltype;

Заранее благодарен!
Flukky
...
Рейтинг: 0 / 0
01.11.2005, 15:41
    #33355597
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() surname
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY'))) d;
...
Рейтинг: 0 / 0
01.11.2005, 16:32
    #33355746
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Действительно, работает очень красиво. Подскажите, пожалуйста, где найти инфрмацию про XMLSequence и Extract (а также другими функциями по обработке XMLType).

Oracle9i XML API Reference - XDK and Oracle XML DB
Release 2 (9.2)
Part VI
XML Database Support: Oracle XML DB for PL/SQL

Тут я что-то не могу найти :/
...
Рейтинг: 0 / 0
01.11.2005, 16:55
    #33355820
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Поищи рядом, в XML Database Developer's Guide - Oracle XML DB , или просто поиском:
http://www.oracle.com/pls/db92/db92.drilldown?remark=&word=XMLSequence+and+extract
...
Рейтинг: 0 / 0
01.11.2005, 17:23
    #33355909
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Мне очень интересно, почему не работает такой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() surname
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE xmlns="http://testserver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://testserver response.xsd">
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY'))) d;

Запрос остаёться тем же, но в теге <RESPONSE> появились дополнительная информация
Код: plaintext
<RESPONSE xmlns="http://testserver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://testserver response.xsd">
...
Рейтинг: 0 / 0
01.11.2005, 17:24
    #33355916
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Denis PopovПоищи рядом, в XML Database Developer's Guide - Oracle XML DB , или просто поиском:
http://www.oracle.com/pls/db92/db92.drilldown?remark=&word=XMLSequence+and+extract

Спасибо, попробуем!
...
Рейтинг: 0 / 0
01.11.2005, 18:11
    #33356054
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
В документации по 9-ке сразу не нашел, а в документации по Oracle10g есть:
http://www.oracle.com/pls/db102/drilldown?remark=quick_search&word=XMLSequence+and+xmlns

Впрочем, работает и в 9i:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() surname
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd">
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract(
          'RESPONSE/DATA/ENTITY'
        , 'xmlns="http://testserver"'
      ))) d;

Обрати внимание на выделенную строку.
...
Рейтинг: 0 / 0
02.11.2005, 18:36
    #33358607
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
А можно, например, какой-то функцией удалить всю дополнительную информацию из тега RESPONSE?
...
Рейтинг: 0 / 0
02.11.2005, 18:37
    #33358611
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
А конкретно, эту ерудну:
Код: plaintext
1.
2.
3.
xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd"
...
Рейтинг: 0 / 0
02.11.2005, 20:01
    #33358759
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
В качестве одной мысли: если исходный XML окаймить еще одним элементом, т.е. вложить в некий другой XML, то extract(), с учетом исправленного пути, работает и без namespace. Осталось только понять, можно ли это сделать максимально легко. В Oracle10 есть метод XMLType.insertXMLBefore(), но в Oracle 9.2 его еще нет. Хотя, думаю, должны быть и другие варианты, может есть способ получить все namespace'ы из документа?
...
Рейтинг: 0 / 0
02.11.2005, 20:20
    #33358781
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Denis Popovможет есть способ получить все namespace'ы из документа?
например, через xmlparser и xmldom:
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96621/adx20ppl.htm#1006936
...
Рейтинг: 0 / 0
03.11.2005, 09:34
    #33359197
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Denis Popov Denis Popovможет есть способ получить все namespace'ы из документа?
например, через xmlparser и xmldom:
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96621/adx20ppl.htm#1006936

Что-то похожее я делал в 8 оракле. Это сначала нужно сложить всё в массив, потом в цикле IFами уже вытаскивать по нужным переменным. Это дело может быть долгим.
...
Рейтинг: 0 / 0
03.11.2005, 09:45
    #33359237
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
И ещё вопрос по этой же теме. Возвращается XML в формате <?xml version="1.0" encoding="utf-8" ?>. Как сменить кодировку на windows-1257?
...
Рейтинг: 0 / 0
03.11.2005, 12:12
    #33359733
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Родился ещё один вопрос. Допустим, у нас есть тот же XML, но уже с двумя "пакетами" внутри:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_002">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="PASSP_NO" value="AAA012345678" />
      <ATTRIBUTE name="ISSUE_DATE" value="01.01.2000" />
    </ENTITY>
  </DATA>
</RESPONSE>

Тоесть есть 2 персоны и только у одной есть пасспорт. Пакеты 001 и 002 связаны по PERS_ID.
Делаю запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
   x1.extract('//ENTITY//ATTRIBUTE[@name="FIRST_NAME"]/@value').getStringVal() as person_name
  ,x1.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() as person_surname
  ,x2.extract('//ENTITY//ATTRIBUTE[@name="PASSP_NO"]/@value').getStringVal() as passport_no
  ,x2.extract('//ENTITY//ATTRIBUTE[@name="ISSUE_DATE"]/@value').getStringVal() as passport_issue_date
from
   table(XMLSequence(v_response_without_passp.extract('RESPONSE/DATA/ENTITY[@name="PACKAGE_001"]'))) x1
  ,table(XMLSequence(v_response_without_passp.extract('RESPONSE/DATA/ENTITY[@name="PACKAGE_002"]'))) x2
where
   extractValue(value(x1),'//ENTITY//ATTRIBUTE[@name="PERS_ID"]/@value') = extractValue(value(x2),'//ENTITY//ATTRIBUTE[@name="PERS_ID"]/@value')

В результате получаем только ту персону, у которой есть пасспорт:
Код: plaintext
1.
2.
3.
4.
person_name = OLGA
person_surname = NOVIKOVA
passport_no = AAA012345678
passport_issue_date =  01 . 01 . 2000 
Как же получить персону, у которой нет пасспорта в таком формате:
Код: plaintext
1.
2.
3.
4.
person_name = ANNA
person_surname = ANTONOVA
passport_no = 
passport_issue_date = 
?

Оператор (+) не работает :(
...
Рейтинг: 0 / 0
03.11.2005, 13:54
    #33360069
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Flukky wrote:
> Что-то похожее я делал в 8 оракле. Это сначала нужно сложить всё в
> массив, потом в цикле IFами уже вытаскивать по нужным переменным. Это
> дело может быть долгим.

Я думал про следующее: через xmldom.getNamespace() получить только этот самый namespace и потом уже
его использовать в extract(). Хотя это получается двойной разбор одного и того же XML. Для
уменьшения накладных расходов Тут можно попробовать еще один вариант: через аналогичный пример,
используя xslprocessor, получить новый XML (раз исходный уже разобран), содержащий минимум требуемых
данных, и потом его уже скормить XMLType.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
03.11.2005, 14:09
    #33360134
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
FlukkyРодился ещё один вопрос.
Код: plaintext
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.
create table tmp_xml (xml XMLType);

insert into tmp_xml (xml) values (XMLType(
'<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_002">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="PASSP_NO" value="AAA012345678" />
      <ATTRIBUTE name="ISSUE_DATE" value="01.01.2000" />
    </ENTITY>
  </DATA>
</RESPONSE>'
));

select p.id
     , max(p.person_surname) person_surname
     , max(p.passport_no) passport_no
     , max(p.passport_issue_date) passport_issue_date
from (select d.extract('//ENTITY//ATTRIBUTE[@name="PERS_ID"]/@value').getStringVal() id
           , d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() person_surname
           , d.extract('//ENTITY//ATTRIBUTE[@name="PASSP_NO"]/@value').getStringVal() passport_no
           , d.extract('//ENTITY//ATTRIBUTE[@name="ISSUE_DATE"]/@value').getStringVal() passport_issue_date
      from tmp_xml t
         , table(XMLSequence(t.xml.extract('RESPONSE/DATA/ENTITY'))) d
     ) p
group by p.id;
...
Рейтинг: 0 / 0
03.11.2005, 16:00
    #33360588
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Денис, спасибо огромнейшее!

Пока буду пробывать предложенные варианты, задам ещё один вопрос.
Вопрос 1. Часть 1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA />
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA- 01403 : no data found</ERROR>
      <ERROR>ORA- 20000 : person_id is empty</ERROR>
    </SYSTEM_ERRORS>
</RESPONSE>
Задача сложить значения элементов <ERROR> в массив.

Код: plaintext
1.
2.
select x.extract('/SYSTEM_MESSAGES/ERROR').getStringVal() as errmsg
from   table(xmlsequence(MY_XML)) x;
Такой запрос возвращает значения элементов <ERROR> и сами элементы "<ERROR>" и "</ERROR>". А нужны только значения, т.е. сообщения об ошибках.
Запрос с extractValue() ругается на то, что возвращено более одной строки и я его понимаю :)

Вопрос 1. Часть 2.
Можно ли значения <ERROR> сложить сразу же в виде:
"сообщение1; сообщение2; сообщение3" с помощью XML-парсера?

Спасибо!
...
Рейтинг: 0 / 0
03.11.2005, 16:44
    #33360719
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
1. Используй text() для вывода значения элемента
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select d.extract('//SYSTEM_ERRORS/ERROR/text()').getStringVal() error
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/SYSTEM_ERRORS'))) d;

Второе можно делать разными путями, например:
XMLSequence возвращает тип table of XMLType, к нему е можно привести:
Код: plaintext
1.
2.
3.
4.
create or replace type XML_TABLE as table of XMLType
/
select ...
from table(cast(XMLSequence(...) as XML_TABLE))
Это я к тому, что на основе статьи из FAQ можно написать функцию по соединению полученных записей.


Через XSL:
Код: plaintext
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.
38.
create table test_xml (xml XMLType);
insert into test_xml (xml) values (XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'));

create table test_xsl (xsl XMLType);
insert into test_xsl (xsl) values (XMLType(
'<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="no"/>

<xsl:template match="/">
<xsl:for-each select="RESPONSE/DATA/SYSTEM_ERRORS/ERROR">
  <xsl:choose>
    <xsl:when test="position()=1"></xsl:when>
    <xsl:otherwise>;</xsl:otherwise>
  </xsl:choose>
  <xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>'));
commit;

select XMLTransform (
          xml.xml
        , (select xsl from test_xsl)
       ).getStringVal() result
from test_xml xml;
...
Рейтинг: 0 / 0
07.11.2005, 11:29
    #33363591
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Denis Popov1. Используй text() для вывода значения элемента
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select d.extract('//SYSTEM_ERRORS/ERROR/text()').getStringVal() error
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/SYSTEM_ERRORS'))) d;


Да, но в этом случае результат будет:
Код: plaintext
1.
Incorrect person ID, please check input dataORA- 01403 : no data foundORA- 20000 : person_id is empty

А мне бы хотелось его красиво оформить перед этим. Error1; Error2; ...
...
Рейтинг: 0 / 0
07.11.2005, 11:31
    #33363597
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Код: plaintext
1.
"//SYSTEM_ERRORS/ERROR[1]/text()"; "//SYSTEM_ERRORS/ERROR[2]/text()"; "//SYSTEM_ERRORS/ERROR[3]/text()".

Только как я могу узнать, сколько элементов <ERROR> у меня в документе?
...
Рейтинг: 0 / 0
07.11.2005, 12:38
    #33363794
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Flukky wrote:
> А мне бы хотелось его красиво оформить перед этим. Error1; Error2; ...

Тогда действуй как я уже говорил: либо через XSL, либо получай несколько записей и обрабатывай их
собственной процедурой. Но text() все равно придется использовать для получения значения элемента.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
07.11.2005, 13:55
    #33364053
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Denis Popov
либо получай несколько записей и обрабатывай их
собственной процедурой. Но text() все равно придется использовать для получения значения элемента.

Я сделал без text() и без собственной процедуры:
1. Вытащил записи в формате <ERROR>...</ERROR>
2. Спомощью функции Replace заменил эти теги

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select replace(replace(d.extract('//SYSTEM_ERRORS/ERROR').getStringVal(),'<ERROR>',null),'</ERROR>',';') error
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/SYSTEM_ERRORS'))) d;

Работать работает :)
...
Рейтинг: 0 / 0
07.11.2005, 15:31
    #33364342
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Denis Popov Denis Popovможет есть способ получить все namespace'ы из документа?
например, через xmlparser и xmldom:
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96621/adx20ppl.htm#1006936

А как тогда преобразовать мой XMLType в dbms_xmldom.DOMDocument и обратно?

Функция будет выглядеть примерно так:
Код: plaintext
1.
2.
function sweeper(p_xml  in xmltype)
return xmltype;
...
Рейтинг: 0 / 0
07.11.2005, 15:42
    #33364388
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Flukky wrote:
> А как тогда преобразовать мой XMLType в dbms_xmldom.DOMDocument и обратно?

Не знаю, может и никак. Через dbms_xmldom я думал только получить namespace, а потом использовать в
XMLType.extract(), потому и говорил о двойном разборе.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
07.11.2005, 16:20
    #33364578
Flukky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML в Oracle9i. Примеры разборки
Denis Popov
Через dbms_xmldom я думал только получить namespace, а потом использовать в
XMLType.extract(), потому и говорил о двойном разборе.
Posted via ActualForum NNTP Server 1.3

Функции из пакета xdb.dbms_xmldom:
Код: plaintext
1.
2.
3.
4.
5.
6.
-- 1
PROCEDURE getNamespace(n DOMnode, data IN OUT VARCHAR2);
-- 2
FUNCTION getNamespace(a DOMAttr) return varchar2;
-- 3
FUNCTION getNamespace(elem DOMElement) return varchar2;

Какую из них использовать (DOMnode, DOMAttr, DOMElement), если на входе у меня параметр типа XMLType?
Либо я совсем не в ту степь смотрю?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки / 25 сообщений из 239, страница 1 из 10
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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