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

Откуда:
Сообщений: 255
Доброго времени суток.

Помогите плз сделать следующее:

имеется XML:

  
<?xml version="1.0" encoding="utf-8"?>
  <company name="Грильяж, кафе">
    <domain name="Кафе" />
    <address name="г. Екатеринбург, Коминтерна, 16">
      <phone name="(343) 379.28.20">
        <operator name="василий" />
      </phone>
      <phone name="(343) 379.28.18" />
      <email name="vladimirova@r96.ru" />
      <web name="www.cafegrilage.ru" />
    </address>
    <address name="г. Екатеринбург, Академика Шварца, 4">
      <phone name="(343) 211.51.80" />
      <phone name="(343) 211.51.88" />
    </address>
  </company>

необходимо получить:
   	TAG	 NAME	                                            ID	P_ID
1 company грильяж, кафе 1
2 domain кафе 2 1
3 address г. екатеринбург, коминтерна, 16 3 1
4 phone (343) 379.28.20 4 3
5 operator василий 5 4
6 phone (343) 379.28.18 6 3
7 email vladimirova@r96.ru 7 3
8 web www.cafegrilage.ru 8 3
9 address г. екатеринбург, академика шварца, 4 9 1
10 phone (343) 211.51.80 10 9
11 phone (343) 211.51.88 11 9
10 фев 11, 09:06    [10212094]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Zepp
Member

Откуда:
Сообщений: 255
вообще реально ли это сделать?
10 фев 11, 10:15    [10212368]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
-2-
Member

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

xmltable
10 фев 11, 10:18    [10212396]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Zepp
Member

Откуда:
Сообщений: 255
-2-,

вот в чем вопрос?
XMLTABLE можно использовать в

banner
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
10 фев 11, 10:39    [10212551]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Zepp
Member

Откуда:
Сообщений: 255
просто у меня при использовании XMLTABLE лезет ошибка

К сообщению приложен файл. Размер - 66Kb
10 фев 11, 11:08    [10212800]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Grihman
Member

Откуда:
Сообщений: 9
WITH t AS (SELECT XMLTYPE('<?xml version="1.0" encoding="utf-8"?>
[SRC PLSQL]<company name="Грильяж, кафе">
<domain name="Кафе" />
<address name="г. Екатеринбург, Коминтерна, 16">
<phone name="(343) 379.28.20">
<operator name="василий" />
</phone>
<phone name="(343) 379.28.18" />
<email name="vladimirova@r96.ru" />
<web name="www.cafegrilage.ru" />
</address>
<address name="г. Екатеринбург, Академика Шварца, 4">
<phone name="(343) 211.51.80" />
<phone name="(343) 211.51.88" />
</address>
</company>
') x FROM dual)
SELECT * FROM t, XMLTABLE(
'company' PASSING x
COLUMNS
company VARCHAR(100) path 'domain/@name'
)
10 фев 11, 13:43    [10214248]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Grihman
Member

Откуда:
Сообщений: 9
все остально можно получить так же.
10 фев 11, 13:45    [10214263]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Grihman
Member

Откуда:
Сообщений: 9
declare
pBody clob :=
'<?xml version="1.0" encoding="utf-8"?>
<company name="Грильяж, кафе">
<domain name="Кафе" />
<address name="г. Екатеринбург, Коминтерна, 16">
<phone name="(343) 379.28.20">
<operator name="василий" />
</phone>
<phone name="(343) 379.28.18" />
<email name="vladimirova@r96.ru" />
<web name="www.cafegrilage.ru" />
</address>
<address name="г. Екатеринбург, Академика Шварца, 4">
<phone name="(343) 211.51.80" />
<phone name="(343) 211.51.88" />
</address>
</company>
';
vDomain varchar2(100);
------------------------------------------------------------------------------

begin
select Trim(t.domain) into vDomain
from XMLTable(
'company'
passing XMLType(pBody)
COLUMNS domain VARCHAR(10) path 'domain/@name'
) t;
dbms_output.put_line(Nvl(vDomain, 'NULL'));
end;
10 фев 11, 13:53    [10214301]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Grihman
Member

Откуда:
Сообщений: 9
как вариант.
10 фев 11, 13:57    [10214330]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Zepp
Member

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

спасибо за вариант, но XMLTABLE я использовать не могу. скрин ошибки выше.
10 фев 11, 13:57    [10214339]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Zepp
имеется XML:

XML известной структуры, или задача состоит в показе значений атрибута name всех элементов, где он есть?
10 фев 11, 14:04    [10214379]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Zepp
Member

Откуда:
Сообщений: 255
Denis Popov,

структура XML заранее неизвестна.
известно только то что нужная информация лежит в аттрибуте "name" каждого тэга

требуется получить список всех тэгов + значения аттрибутов + сохранить структуру через связку ID+P_ID
10 фев 11, 14:12    [10214454]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
lLocust
Member

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

не совсем то что Вам нужно, допилите если что:

WITH XML
       AS (SELECT   xmltype('<?xml version="1.0" encoding="utf-8"?>
  <company name="Грильяж, кафе">
    <domain name="Кафе" />
    <address name="г. Екатеринбург, Коминтерна, 16">
      <phone name="(343) 379.28.20">
        <operator name="василий" />
      </phone>
      <phone name="(343) 379.28.18" />
      <email name="vladimirova@r96.ru" />
      <web name="www.cafegrilage.ru" />
    </address>
    <address name="г. Екатеринбург, Академика Шварца, 4">
      <phone name="(343) 211.51.80" />
      <phone name="(343) 211.51.88" />
    </address>
  </company>') xml
             FROM   DUAL),
    COMP
       AS (SELECT   EXTRACTVALUE (VALUE (t), 'company/domain/@name') domain,
                    VALUE (t) comp_xml
             FROM   XML,
                    TABLE (XMLSEQUENCE (EXTRACT (XML.xml, 'company'))) t)
SELECT   COMP.domain,
         EXTRACTVALUE (VALUE (t), 'address/email/@name') email,
         EXTRACTVALUE (VALUE (t), 'address/web/@name') web,
         VALUE (t) ADR_xml
  FROM   COMP, TABLE (XMLSEQUENCE (EXTRACT (COMP.comp_xml, 'company/address'))) t
10 фев 11, 14:18    [10214493]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
lLocust
Member

Откуда:
Сообщений: 338
Zepp
Denis Popov,

структура XML заранее неизвестна.
известно только то что нужная информация лежит в аттрибуте "name" каждого тэга

требуется получить список всех тэгов + значения аттрибутов + сохранить структуру через связку ID+P_ID


ах даже так.... тогда парсить
10 фев 11, 14:20    [10214514]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Zepp
Member

Откуда:
Сообщений: 255
а если бы была возможность использовать XMLTABLE, то задача выполнима?
10 фев 11, 14:34    [10214654]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Elic
Member

Откуда:
Сообщений: 29991
Zepp
требуется получить список всех тэгов + значения аттрибутов + сохранить структуру через связку ID+P_ID
dbms_xmldom + pipelined справятся, ПМСМ.
10 фев 11, 14:45    [10214760]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Zepp
Member

Откуда:
Сообщений: 255
многоуважаемый Elic :)
не могли бы вы продемонстрировать возможноть наглядно.
10 фев 11, 14:52    [10214836]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Zepp
структура XML заранее неизвестна.
известно только то что нужная информация лежит в аттрибуте "name" каждого тэга

требуется получить список всех тэгов + значения аттрибутов + сохранить структуру через связку ID+P_ID

Список получить можно так:
select XmlTransform(
           XmlType(
'<?xml version="1.0" encoding="utf-8"?>
  <company name="Грильяж, кафе">
    <domain name="Кафе" />
    <address name="г. Екатеринбург, Коминтерна, 16">
      <phone name="(343) 379.28.20">
        <operator name="василий" />
      </phone>
      <phone name="(343) 379.28.18" />
      <email name="vladimirova@r96.ru" />
      <web name="www.cafegrilage.ru" />
    </address>
    <address name="г. Екатеринбург, Академика Шварца, 4">
      <phone name="(343) 211.51.80" />
      <phone name="(343) 211.51.88" />
    </address>
  </company>'
           )
         , XmlType(
'<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*">
    <xsl:value-of select="local-name()"/><xsl:text> : </xsl:text><xsl:value-of select="@name"/>
    <xsl:call-template name="rec"/>
  </xsl:template>
  <xsl:template name="rec">
     <xsl:for-each select="child::node()">
       <xsl:text>
</xsl:text>
       <xsl:value-of select="local-name()"/><xsl:text> : </xsl:text><xsl:value-of select="@name"/>
       <xsl:call-template name="rec"/>
     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>'
           )
).getClobVal()
from DUAL;
ID+P_ID, думаю, тоже можно добавить, т.е. глядеть в сторону XSLT.
10 фев 11, 14:54    [10214855]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Zepp
многоуважаемый Elic :)
не могли бы вы продемонстрировать возможноть наглядно.

stff например
10 фев 11, 14:59    [10214901]     Ответить | Цитировать Сообщить модератору
 Re: Разбор XML  [new]
Zepp
Member

Откуда:
Сообщений: 255
Denis Popov,

спасибо за наводку в сторону XSLT.

проделано следующее:

на исходный XML наложено XSLT, но не в Oracle, а шагом ранее, т.к. наш сервер отказался работать с "xsl:stylesheet version="2.0""

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:qq="http://example.com/qq">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:template match="/">
    <table>
      <xsl:apply-templates select="//*"/>
    </table>
  </xsl:template>
  <xsl:function name="qq:nodeNumber">
    <xsl:param name="n"/>
    <xsl:number select="$n" level="multiple" format="1.1" count="*"/>
  </xsl:function>
  <xsl:template match="*">
    <row id="{qq:nodeNumber(.)}" name="{node-name(.)}" value="{@name}" parent-id="{qq:nodeNumber(..)}"/>
  </xsl:template>
</xsl:stylesheet>

в результате преобразования имеем XML другой структуры, НО! всегда постоянной:

<table xmlns:qq="http://example.com/qq">
   <row id="1" name="company" value="Грильяж, кафе" parent-id=""/>
   <row id="1.1" name="domain" value="Кафе" parent-id="1"/>
   <row id="1.2" name="address" value="г. Екатеринбург, Коминтерна, 16" parent-id="1"/>
   <row id="1.2.1" name="phone" value="(343) 379.28.20" parent-id="1.2"/>
   <row id="1.2.1.1" name="operator" value="василий" parent-id="1.2.1"/>
   <row id="1.2.2" name="phone" value="(343) 379.28.18" parent-id="1.2"/>
   <row id="1.2.3" name="email" value="vladimirova@r96.ru" parent-id="1.2"/>
   <row id="1.2.4" name="web" value="www.cafegrilage.ru" parent-id="1.2"/>
   <row id="1.3" name="address" value="г. Екатеринбург, Академика Шварца, 4" parent-id="1"/>
   <row id="1.3.1" name="phone" value="(343) 211.51.80" parent-id="1.3"/>
   <row id="1.3.2" name="phone" value="(343) 211.51.88" parent-id="1.3"/>
</table>


этот XML передается в Oracle , а там уже нормальный разбор
    select 
     extractvalue(x.column_value, 'row/@id') id
    ,extractvalue(x.column_value, 'row/@parent-id') p_id
    ,extractvalue(x.column_value, 'row/@name') item
    ,extractvalue(x.column_value, 'row/@value') value  
      ,rownum
from   table(xmlsequence(extract(xmltype(
'<table xmlns:qq="http://example.com/qq">
   <row id="1" name="company" value="Грильяж, кафе" parent-id=""/>
   <row id="1.1" name="domain" value="Кафе" parent-id="1"/>
   <row id="1.2" name="address" value="г. Екатеринбург, Коминтерна, 16" parent-id="1"/>
   <row id="1.2.1" name="phone" value="(343) 379.28.20" parent-id="1.2"/>
   <row id="1.2.1.1" name="operator" value="василий" parent-id="1.2.1"/>
   <row id="1.2.2" name="phone" value="(343) 379.28.18" parent-id="1.2"/>
   <row id="1.2.3" name="email" value="vladimirova@r96.ru" parent-id="1.2"/>
   <row id="1.2.4" name="web" value="www.cafegrilage.ru" parent-id="1.2"/>
   <row id="1.3" name="address" value="г. Екатеринбург, Академика Шварца, 4" parent-id="1"/>
   <row id="1.3.1" name="phone" value="(343) 211.51.80" parent-id="1.3"/>
   <row id="1.3.2" name="phone" value="(343) 211.51.88" parent-id="1.3"/>
</table>')
                                 ,'table/row'))) x 

всем спасибо.
11 фев 11, 07:27    [10217952]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить