powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Универсальный разбор XML
12 сообщений из 12, страница 1 из 1
Универсальный разбор XML
    #39550233
dimyaz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли написать универсальный парсер XML который будет делать следующее:

Есть XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<Body>
	<table>
		<product>
			<name>Product1</name>
			<col1>Value1</col1>
			<col2>Value2</col2>
			<col3>Value3</col3>
			<col4>Value4</col4>
		</product>
		<product>
			<name>Product2</name>
			<col1>Value1</col1>
			<col2>Value2</col2>
			<col3>Value3</col3>
			<col4>Value4</col4>
		</product>
	</table>
</Body>



Запускаем запрос, и он выдает:
namecol1col2col3col4Product1Value1Value2Value3Value4Product2Value1Value2Value3Value4
...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550235
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"...не знаю как пацаны, а я не возражаю..." (с)

Может, xmltable все-таки подойдет?
...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550252
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimyazМожно ли написать универсальный парсер XML который будет делать следующее:

Есть XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<Body>
	<table>
		<product>
			<name>Product1</name>
			<col1>Value1</col1>
			<col2>Value2</col2>
			<col3>Value3</col3>
			<col4>Value4</col4>
		</product>
		<product>
			<name>Product2</name>
			<col1>Value1</col1>
			<col2>Value2</col2>
			<col3>Value3</col3>
			<col4>Value4</col4>
		</product>
	</table>
</Body>



Запускаем запрос, и он выдает:
namecol1col2col3col4Product1Value1Value2Value3Value4Product2Value1Value2Value3Value4

Можно
...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550267
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimyazуниверсальный парсер
Универсальность в чём? Пока что постановка вопроса из серии "у меня в подвале который год раздаётся странный стук".

Штатный отдел телепатов говорит, что вопрос про динамическое количество столбцов. Но это не точно.
...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550273
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envпро динамическое количество столбцов. Но это не точно.
...и не определенные их названия, не говоря уже о типах данных :)
...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550277
dimyaz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envdimyazуниверсальный парсер
Универсальность в чём? Пока что постановка вопроса из серии "у меня в подвале который год раздаётся странный стук".

Штатный отдел телепатов говорит, что вопрос про динамическое количество столбцов. Но это не точно.

Универсальность в том, чтобы не вытаскивать каждый тэг по отдельности.
Да, кол-ов столбцов может быть разное.
...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550342
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Универсальность разбора заканчивается на этом этапе
Код: plsql
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.
39.
40.
41.
42.
43.
44.
45.
46.
column attr_name  format a15
column attr_value format a15

select *
from xmltable(
'/Body/table/product/node()'
passing xmltype('
<Body>
        <table>
                <product>
                        <name>Product1</name>
                        <col1>Value1</col1>
                        <col2>Value2</col2>
                        <col3>Value3</col3>
                        <col4>Value4</col4>
                </product>
                <product>
                        <name>Product2</name>
                        <col1>Value1</col1>
                        <col2>Value2</col2>
                        <col3>Value3</col3>
                        <col4>Value4</col4>
                </product>
        </table>
</Body>')
columns
prod_id    number path 'for $i in ../. return count(../../*[. << $i]) + 1',
attr_order number path 'for $i in    . return count(   ../*[. << $i]) + 1',
attr_name  varchar2(4000) path 'name()',
attr_value varchar2(4000) path 'text()'
);

   PROD_ID ATTR_ORDER ATTR_NAME       ATTR_VALUE
---------- ---------- --------------- ---------------
         1          1 name            Product1
         1          2 col1            Value1
         1          3 col2            Value2
         1          4 col3            Value3
         1          5 col4            Value4
         2          1 name            Product2
         2          2 col1            Value1
         2          3 col2            Value2
         2          4 col3            Value3
         2          5 col4            Value4

10 строк выбрано.

Далее сделать пивот с динамическим набором колонок можно... только обратно в XML:
Pivot
Код: plsql
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
with s as (
select *
from xmltable(
'/Body/table/product/node()'
passing xmltype('
<Body>
        <table>
                <product>
                        <name>Product1</name>
                        <col1>Value1</col1>
                        <col2>Value2</col2>
                        <col3>Value3</col3>
                        <col4>Value4</col4>
                </product>
                <product>
                        <name>Product2</name>
                        <col1>Value1</col1>
                        <col2>Value2</col2>
                        <col3>Value3</col3>
                        <col4>Value4</col4>
                </product>
        </table>
</Body>')
columns
prod_id    number path 'for $i in ../. return count(../../*[. << $i]) + 1',
attr_order number path 'for $i in    . return count(   ../*[. << $i]) + 1',
attr_name  varchar2(4000) path 'name()',
attr_value varchar2(4000) path 'text()'
)
)
select *
from s
pivot xml (max(attr_value) as attr_value, max(attr_order) as attr_order for attr_name in (any));

   PROD_ID
----------
ATTR_NAME_XML
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         1
<PivotSet><item><column name = "ATTR_NAME">col1</column><column name = "ATTR_VALUE">Value1</column><column name = "ATTR_ORDER">2</column></item><item><column name = "ATTR_NAME">col2</column><column na
me = "ATTR_VALUE">Value2</column><column name = "ATTR_ORDER">3</column></item><item><column name = "ATTR_NAME">col3</column><column name = "ATTR_VALUE">Value3</column><column name = "ATTR_ORDER">4</co
lumn></item><item><column name = "ATTR_NAME">col4</column><column name = "ATTR_VALUE">Value4</column><column name = "ATTR_ORDER">5</column></item><item><column name = "ATTR_NAME">name</column><column
name = "ATTR_VALUE">Product1</column><column name = "ATTR_ORDER">1</column></item></PivotSet>

         2
<PivotSet><item><column name = "ATTR_NAME">col1</column><column name = "ATTR_VALUE">Value1</column><column name = "ATTR_ORDER">2</column></item><item><column name = "ATTR_NAME">col2</column><column na
me = "ATTR_VALUE">Value2</column><column name = "ATTR_ORDER">3</column></item><item><column name = "ATTR_NAME">col3</column><column name = "ATTR_VALUE">Value3</column><column name = "ATTR_ORDER">4</co
lumn></item><item><column name = "ATTR_NAME">col4</column><column name = "ATTR_VALUE">Value4</column><column name = "ATTR_ORDER">5</column></item><item><column name = "ATTR_NAME">name</column><column
name = "ATTR_VALUE">Product2</column><column name = "ATTR_ORDER">1</column></item></PivotSet>

...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550343
dimyaz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimyaz,

Просто как я могу решить эту задачу - это за ранее взять XML, вытащить все возможные в нем названия тэгов, и написать запрос который будет вытаскивать значение каждого тэга и заполнять столбец.
В этом наверно и вопрос, как вытащить названия всех тэгов.
...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550357
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот если забыть вытащить XML-список в select-list, то можно словить ORA-00600
Код: plsql
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
select * from v$version;

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production              0
PL/SQL Release 12.1.0.2.0 - Production                                                    0
CORE    12.1.0.2.0      Production                                                                0
TNS for Linux: Version 12.1.0.2.0 - Production                                            0
NLSRTL Version 12.1.0.2.0 - Production                                                    0


with s as (
select *
from xmltable(
'/Body/table/product/node()'
passing xmltype('
<Body>
  <table>
    <product>
      <name>Product1</name>
      <col1>Value1</col1>
      <col2>Value2</col2>
      <col3>Value3</col3>
      <col4>Value4</col4>
    </product>
    <product>
      <name>Product2</name>
      <col1>Value1</col1>
      <col2>Value2</col2>
      <col3>Value3</col3>
      <col4>Value4</col4>
    </product>
  </table>
</Body>')
columns
prod_id    number path 'for $i in ../. return count(../../*[. << $i]) + 1',
attr_order number path 'for $i in    . return count(   ../*[. << $i]) + 1',
attr_name  varchar2(4000) path 'name()',
attr_value varchar2(4000) path 'text()'
))
select prod_id--, attr_name_xml
from s
pivot xml
(max(attr_value) as max_value for attr_name in (any)
);
with s as (
*
ошибка в строке 1:
ORA-00600: код внутренней ошибки, аргументы: [qkebCreateColInFro:1], [], [], [], [], [], [], [], [], [], [], []

...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550380
Код: plsql
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.
with t as (select xmltype('<Body><table><product><name>Product1</name><col1>Value1</col1><col2>Value2</col2><col3>Value3</col3><col4>Value4</col4></product><product><name>Product2</name><col1>Value1</col1><col2>Value2</col2><col3>Value3</col3><col4>Value4</col4></product></table></Body>') x from dual)
select xt.*
from t, 
xmltable(
    '//*' 
    passing t.x 
    columns id for ordinality,
            "name()" varchar2(10),
            "../name()" varchar2(10),
            "text()" varchar2(10)
) xt;

        ID name()     ../name()  text()    
---------- ---------- ---------- ----------
         1 Body                            
         2 table      Body                 
         3 product    table                
         4 name       product    Product1  
         5 col1       product    Value1    
         6 col2       product    Value2    
         7 col3       product    Value3    
         8 col4       product    Value4    
         9 product    table                
        10 name       product    Product2  
        11 col1       product    Value1    
        12 col2       product    Value2    
        13 col3       product    Value3    
        14 col4       product    Value4    
...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39550417
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хрен редьки,

Широка строка моя родная.
...
Рейтинг: 0 / 0
Универсальный разбор XML
    #39552927
dimyaz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хрен редьки,

Вот это Реально круто.
Спасибо!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Универсальный разбор XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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