Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Распарсить xml  [new]
zmeykin62
Member

Откуда:
Сообщений: 107
Ребят
Есть такой xml нужно распарсить его и вывести значения в 2 столбца (1. список атр id 2. атр stment ) я делаю так

declare

zx xmltype;
begin
zx := XMLType('<?xml version="1.0" encoding="UTF-8"?>
<response>
<statement stment="423112341234">
<error code="113">
<order id="20290003528699" />
<order id="20290003528703" />
<order id="20290003528703" />
</error></statement>
</response>');
 for i in(
select 
-- ExtractValue(Value(p),'/statement/@stment') as register_id into reg_id
 ExtractValue(Value(p),'/statement/error/order/@id') as register_id  into reg_id
FROM
TABLE(XMLSequence(EXTRACT(zx,'/response/statement'))) p
)
loop
dbms_output.put_line(reg_id);
end loop;
end if;

END;

получаю ошибку
ORA-19025: EXTRACTVALUE возвращает значение только одного узла
как вернуть все атрибуты используя ExtractValue?
20 май 14, 03:16    [16040353]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить xml  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
zmeykin62,

SQL> select xstm.stment, xord.id
  2    from xmltable('/response/statement'
  3           passing
  4           XMLType('<?xml version="1.0" encoding="UTF-8"?>
  5                    <response>
  6                      <statement stment="423112341234">
  7                        <error code="113">
  8                          <order id="20290003528699" />
  9                          <order id="20290003528703" />
 10                          <order id="20290003528703" />
 11                        </error>
 12                      </statement>
 13                    </response>')
 14           columns
 15             stment int path '@stment',
 16             orders xmltype path '/statement/error') xstm,
 17         xmltable('/error/order' passing xstm.orders
 18           columns
 19             id int path '@id') xord;

          STMENT               ID
---------------- ----------------
    423112341234   20290003528699
    423112341234   20290003528703
    423112341234   20290003528703
20 май 14, 05:09    [16040392]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить xml  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
SeaGate,

+xquery
SQL> select *
  2    from xmltable(
  3           'let $stment:=$resp/response/statement/@stment
  4           for $order in $resp/response/statement/error/order
  5           return (
  6             <order id="{xs:integer($order/@id)}" stment="{xs:integer($stment)}"/>
  7           )'
  8           passing XMLType('<?xml version="1.0" encoding="UTF-8"?>
  9                    <response>
 10                      <statement stment="423112341234">
 11                        <error code="113">
 12                          <order id="20290003528699" />
 13                          <order id="20290003528703" />
 14                          <order id="20290003528703" />
 15                        </error>
 16                      </statement>
 17                    </response>') as "resp"
 18           columns
 19             id     int path '@id',
 20             stment int path '@stment')
 21  /

              ID           STMENT
---------------- ----------------
  20290003528699     423112341234
  20290003528703     423112341234
  20290003528703     423112341234
20 май 14, 05:33    [16040398]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить xml  [new]
jeka911
Member

Откуда:
Сообщений: 162
А блин ребят забыл написать у меня старая версия 10тки xmltable не разбирает(
20 май 14, 10:27    [16041006]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить xml  [new]
jeka911
Member

Откуда:
Сообщений: 162
ExtractValue возможно зделать?)
20 май 14, 10:28    [16041013]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить xml  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
jeka911,
outer join в зависимости от наличия/отсутствия order.
SQL> select xmltype(t.x).extract('/response/statement/@stment').getNumberVal() stment,
  2         xt.column_value.extract('/order/@id').getNumberVal() order_id
  3    from (select '<?xml version="1.0" encoding="UTF-8"?>
  4                  <response>
  5                    <statement stment="423112341234">
  6                      <error code="113">
  7                        <order id="20290003528699" />
  8                        <order id="20290003528703" />
  9                        <order id="20290003528703" />
 10                      </error>
 11                    </statement>
 12                  </response>' x
 13            from dual) t,
 14         table(xmlsequence(xmltype(t.x).extract('/response/statement/error/order')))(+) xt;

          STMENT         ORDER_ID
---------------- ----------------
    423112341234   20290003528699
    423112341234   20290003528703
    423112341234   20290003528703
20 май 14, 11:30    [16041402]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить