Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 xmltype и деэкранирование  [new]
feagooor
Guest
есть xml вида
<SetDocument xmlns="http://xxx.kz/">
  <xml>
    <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <PersonalData>
        <FirstName/>
        <SecondName/>
        <MiddleName/>
        <JobName>Admin</JobName>
        <Phone>123</Phone>
        <Email>ADMIN_TEST</Email>
      </PersonalData>
    </Root>
  </xml>
</SetDocument>

Необходимо выдернуть часть с <root></root> в отдельную переменную в виде XML
Можно ли как-то разэкранировать спецсимволы, без использования
replace(replace(replace(r.GetClobVal(), '<', '<'),
       '>',
       '>'),
'"',
'"')

смотрю в сторону EXTRACTVALUE, пробовал конструкцию
select xmltype(extractValue(r,'/SetDocumentResponse/SetDocumentResult'))
into r
from dual;

но что-то не помогло
10 фев 14, 19:13    [15547970]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
feagooor
Guest
перевел символы(
<SetDocument xmlns="http://xxx.kz/">
  <xml>
    <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <PersonalData>
        <FirstName/>
        <SecondName/>
        <MiddleName/>
        <JobName>Admin</JobName>
        <Phone>123</Phone>
        <Email>ADMIN_TEST</Email>
      </PersonalData>
    </Root>
  </xml>
</SetDocument>
10 фев 14, 19:15    [15547978]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
feagooor
Guest
в картинке

К сообщению приложен файл. Размер - 19Kb
10 фев 14, 19:20    [15547989]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
-2-
Member

Откуда:
Сообщений: 15330
feagooor,

Напиши неймспес в extractvalue
10 фев 14, 19:29    [15548014]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
with t as (
           select xmltype('<SetDocument xmlns="http://xxx.kz/">
  <xml>
    <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <PersonalData>
        <FirstName/>
        <SecondName/>
        <MiddleName/>
        <JobName>Admin</JobName>
        <Phone>123</Phone>
        <Email>ADMIN_TEST</Email>
      </PersonalData>
    </Root>
  </xml>
</SetDocument>') doc from dual
          )
select  extract(doc,'/SetDocument/xml/Root','xmlns="http://xxx.kz/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"')
  from  t
/

EXTRACT(DOC,'/SETDOCUMENT/XML/ROOT','XMLNS="HTTP://XXX.KZ/"XMLNS:XSI="HTTP://WWW
--------------------------------------------------------------------------------
<Root xmlns="http://xxx.kz/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc
e" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><PersonalData><FirstName/><Secon
dName/><MiddleName/><JobName>Admin</JobName><Phone>123</Phone><Email>ADMIN_TEST<
/Email></PersonalData></Root>


SCOTT@pdb1orcl12 >


SY.
10 фев 14, 19:46    [15548066]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
feagooor
Guest
-2-,

спасибо! весь день мучаюсь.
решение:
with t as(
select xmlelement("Root",
         XMLAttributes('http://xxx.kz/' AS "xmlns"),
         xmlelement ("recieve",
           xmlelement ("xml", 
             xmlelement("client",
               xmlelement("FirstName",'Петров'),
               xmlelement("LastName",'Петр')
             ).getclobVal()
           )
         )
       ) xml
from dual
)
SELECT (extractValue(t.xml,'/Root/recieve/xml','xmlns="http://xxx.kz/"'))
from t;
10 фев 14, 19:52    [15548091]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
feagooor
Guest
проблема вернулась в виде ошибки
ORA-01706: user function result value was too large

при
select extractValue(r,'/SetDocumentResponse/SetDocumentResult','xmlns="http://xxx.kz/"')
        into   rr
        from   dual;

где r нужный xmltype

странно, потому что вариант:
with t as(
select xmlelement("Root",
         XMLAttributes('http://xxx.kz/' AS "xmlns"),
         xmlelement ("recieve",
           xmlelement ("xml", 
             (select xmlagg( 
                      xmlelement("client",
                        xmlelement("FirstName",'Петров'),
                        xmlelement("FirstName",'Петров')
                      )
                    ).getclobVal()
             from   dual
             connect by level<12000
            )
           )
         )
       ) xml
from dual
)

select (extractValue(t.xml,'/Root/recieve/xml','xmlns="http://xxx.kz/"'))
from t;

вариант SY у меня не преобразует escape символы в спецсимволы((
помогите
10 фев 14, 21:00    [15548359]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
-2-
Member

Откуда:
Сообщений: 15330
feagooor
проблема вернулась в виде ошибки
ORA-01706: user function result value was too large
xmltable(... clob) или xmlcast(extract(...) as clob)
10 фев 14, 22:32    [15548663]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
Mit
Member

Откуда: Мытищи
Сообщений: 819
Или value(x).extract().getClobVal()
11 фев 14, 09:53    [15549482]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
-2-
Member

Откуда:
Сообщений: 15330
Mit
Или value(x).extract().getClobVal()
extract возвращает тип xml, даже если это ./text(), getClobVal() возвращает этот xml как есть - без "деэкранирование".
11 фев 14, 11:14    [15549957]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
Mit
Member

Откуда: Мытищи
Сообщений: 819
-2-
Mit
Или value(x).extract().getClobVal()
extract возвращает тип xml, даже если это ./text(), getClobVal() возвращает этот xml как есть - без "деэкранирование".


Так можно потом над полученным результатом сделать dbms_xmlgen.convert. Или я как то неправильно понял задачу.
12 фев 14, 10:15    [15555068]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
feagor
Member

Откуда: Москва
Сообщений: 256
Mit,

есть SQL запрос:
через который выполняет необходимую задачу:
with t as(
select xmlelement("Root",
         XMLAttributes('http://xxx.kz/' AS "xmlns"),
         xmlelement ("recieve",
           xmlelement ("xml", 
             (select xmlagg( 
                      xmlelement("client",
                        xmlelement("FirstName",'Петров'),
                        xmlelement("FirstName",'Петров')
                      )
                    ).getclobVal()
             from   dual
             connect by level<12000
            )
           )
         )
       ) xml
from dual
)
select (extractValue(t.xml,'/Root/recieve/xml','xmlns="http://xxx.kz/"'))
from t;


и есть pl/sql запрос, который выдает ошибку:

declare
t xmltype;
tt clob;
begin
--with t as(
select xmlelement("Root",
         XMLAttributes('http://xxx.kz/' AS "xmlns"),
         xmlelement ("recieve",
           xmlelement ("xml", 
             (select xmlagg( 
                      xmlelement("client",
                        xmlelement("FirstName",'Петров'),
                        xmlelement("FirstName",'Петров')
                      )
                    ).getclobVal()
             from   dual
             connect by level<102
            )
           )
         )
       ) xml
into t
from dual;
--)
select (extractValue(t,'/Root/recieve/xml','xmlns="http://xxx.kz/"')) s
into tt
from dual;
end;


Вопрос в том как достичь такого же результата, как и в первом примере, но с использованием pl/sql
p/s Oracle 11gr2
12 фев 14, 14:45    [15557223]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
vladimir74
Member

Откуда: Отсюда
Сообщений: 3613
feagor
Вопрос в том как достичь такого же результата, как и в первом примере, но с использованием pl/sql
p/s Oracle 11gr2

может я не понял смысл вопроса?
declare
tt clob;
begin
with t as(
select xmlelement("Root",
         XMLAttributes('http://xxx.kz/' AS "xmlns"),
         xmlelement ("recieve",
           xmlelement ("xml", 
             (select xmlagg( 
                      xmlelement("client",
                        xmlelement("FirstName",'Петров'),
                        xmlelement("FirstName",'Петров')
                      )
                    ).getclobVal()
             from   dual
             connect by level<12
            )
           )
         )
       ) xml
from dual
)
select (extractValue(t.xml,'/Root/recieve/xml','xmlns="http://xxx.kz/"'))
into tt
from t;
end;
12 фев 14, 16:16    [15558021]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
feagor,

l_xmltype:=t.extract('/Root/recieve/xml','xmlns="http://xxx.kz/"')
12 фев 14, 16:22    [15558062]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
feagor
Member

Откуда: Москва
Сообщений: 256
xtender, правильно?
declare
t xmltype;
l_xmltype xmltype;
begin
--with t as(
select xmlelement("Root",
         XMLAttributes('http://xxx.kz/' AS "xmlns"),
         xmlelement ("recieve",
           xmlelement ("xml", 
             (select xmlagg( 
                      xmlelement("client",
                        xmlelement("FirstName",'Петров'),
                        xmlelement("FirstName",'Петров')
                      )
                    ).getclobVal()
             from   dual
             connect by level<102
            )
           )
         )
       ) xml
into t
from dual;
--)
l_xmltype:=t.extract('/Root/recieve/xml','xmlns="http://xxx.kz/"');
DBMS_OUTPUT.PUT_LINE( l_xmltype.getclobval());
end;


в результате <, > не преобразовались обратно

К сообщению приложен файл. Размер - 3Kb
13 фев 14, 09:32    [15560685]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
feagor
Member

Откуда: Москва
Сообщений: 256
vladimir74, я видимо криво объясняю.
в реальном примере не надо генерировать XML. она уже есть, необходимо лишь вытащить из неё тэг <xml>, с преобразованием escape символов обратно.
В вашем примере действительно не возникает ошибка, но нужно распарсить уже существующую XML, а не сразу же сгенерированную. Не знаю почему, но разница видимо есть.
13 фев 14, 09:42    [15560745]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
AntonG
Member

Откуда: Иркутск
Сообщений: 38
utl_i18n.unescape_reference
13 фев 14, 09:57    [15560806]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
feagor
Member

Откуда: Москва
Сообщений: 256
AntonG, Спасибо. работает. но,видимо лишь на небольших файлах(сделал connect by level<12000 - 5 минут уже висит, брейкаю)
13 фев 14, 10:11    [15560886]     Ответить | Цитировать Сообщить модератору
 Re: xmltype и деэкранирование  [new]
AntonG
Member

Откуда: Иркутск
Сообщений: 38
feagor,
тогда
DBMS_XMLGEN.CONVERT (xmlData => l_xmltype.getclobval(),flag => DBMS_XMLGEN.ENTITY_DECODE);
13 фев 14, 11:44    [15561666]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить