Как разобрать большой XML?

lmdleon
Дата: 06.06.2006 14:58:22
XML такой структуры (см. картинку).
Во всяком случае должен быть. Формирую его так:

http_resp := utl_http.get_response(http_req);
env := null;

LOOP
text := text||env;
utl_http.read_text(http_resp, env);
END LOOP;
....
xmltext := xmltype(text);

Курсор не ругается.. но пустой:
cursor cr_xml is
select extract(value(d2), '/p/@id') .getNumberVal() project_id,
extract(value(d2), '/p/@user') .getStringVal() user_id,
extract(value(d2), '/p/@role') .getNumberVal() role_id
from table(XMLSequence(XMLTYPE(xmltext)
.extract('/soap:Envelope/soap:Body/GetProjectParticipatResponse/GetProjectParticipatResult/Result/Data/p'))) d2;
vr_xml cr_xml%ROWTYPE := NULL;

Вопросы такие:
1) Где может быть ошибка?
2) Есть ли substring для clob который возвращает clob?
lmdleon
Дата: 06.06.2006 15:22:41
Когда респонз был маленький (влезал в varchar2)

Я вырезал с помошью substring "<Data>...</Data>"

и курсор:

cursor cr_xml is
select extract(value(d2), '/p/@id') .getNumberVal() project_id,
extract(value(d2), '/p/@user') .getStringVal() user_id,
extract(value(d2), '/p/@role') .getNumberVal() role_id
from table(XMLSequence(XMLTYPE(xmltext)
.extract('/Data/p'))) d2;
vr_xml cr_xml%ROWTYPE := NULL;

возвращял все что нужно.
Denis Popov
Дата: 06.06.2006 15:29:44

Ты бы лучше прикрепил не картинку, и текстовый файл, м.б. сжатый.

Posted via ActualForum NNTP Server 1.3

lmdleon
Дата: 06.06.2006 15:47:59
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body>
<GetProjectParticipatResponse xmlns="http://tempuri.org/">
<GetProjectParticipatResult>
<Result xmlns="">
<Status>
<Code>0</Code>
<Descr />
<Stack />
</Status>
<Data>
...
<p id="1232" user="b6307634-9367-40b3-9d95-001b913e96fc" role="11" />
<p id="1231" user="b6307634-9367-40b3-9d95-001b913e96fc" role="11" />
<p id="1232" user="b6307634-9367-40b3-9d95-001b913e96fc" role="3" />
...
<Data />
</Result>
</GetProjectParticipatResult>
</GetProjectParticipatResponse>
</soap:Body>
</soap:Envelope>
lmdleon
Дата: 06.06.2006 16:14:06
А как посмотреть что внутри clob?
Denis Popov
Дата: 06.06.2006 16:25:58
Это не из-за CLOB, а из-за простанства имен. Действительно ли, что <GetProjectParticipatResponse xmlns="http://tempuri.org/"> а <Result xmlns="">?
lmdleon
Дата: 06.06.2006 16:28:06
А на что это может повлиять?

Походу из-за <Result xmlns="">
lmdleon
Дата: 06.06.2006 16:30:06
Объясни, пожалуйста, для чего этот xmlns?
Я думал в рамках этого xmlns условно не должно быть одинаковых названий разных параметров.
Denis Popov
Дата: 06.06.2006 16:44:18
Как в теории - не знаю, а на практике получается следующее:
sSQL> select XMLType(
  2           '<a xmlns="http://tempuri.org/">1</a>'
  3         ).extract('/a/text()') a
  4  from dual;

A
----------------------------------------------------


SQL> select XMLType(
  2           '<a xmlns="http://tempuri.org/">1</a>'
  3         ).extract(
  4             '/a/text()'
  5           , 'xmlns="http://tempuri.org/'
  6         ) a
  7  from dual;

A
----------------------------------------------------
1
Вот если оставить просто <Result> или сделать одинаковым (т.е <Result xmlns="http://tempuri.org/">), то пройдет такое:
select extract(value(d2), '/p/@id').getNumberVal() project_id,
       extract(value(d2), '/p/@user').getStringVal() user_id,
       extract(value(d2), '/p/@role').getNumberVal() role_id
from table(XMLSequence(XMLType(
'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetProjectParticipatResponse xmlns="http://tempuri.org/">
      <GetProjectParticipatResult>
        <Result>
          <Status><Code>0</Code><Descr/><Stack/></Status>
          <Data>
            <p id="1232" user="b6307634-9367-40b3-9d95-001b913e96fc" role="11" />
            <p id="1231" user="b6307634-9367-40b3-9d95-001b913e96fc" role="11" />
            <p id="1232" user="b6307634-9367-40b3-9d95-001b913e96fc" role="3" />
          </Data>
        </Result>
      </GetProjectParticipatResult>
    </GetProjectParticipatResponse>
  </soap:Body>
</soap:Envelope>'
     ).extract(
         '/soap:Envelope/soap:Body/GetProjectParticipatResponse/GetProjectParticipatResult/Result/Data/p'
       , 'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://tempuri.org/"'
     ))) d2;


lmdleon
Дата: 06.06.2006 17:34:13
Спасибо, на мелкософте таких проблем вроде нет. Оракл более требователен (и это прально :) ).