Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Универсальный разбор XML / 12 сообщений из 12, страница 1 из 1
09.11.2017, 14:09
    #39550233
dimyaz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Универсальный разбор XML
Можно ли написать универсальный парсер 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
09.11.2017, 14:11
    #39550235
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Универсальный разбор XML
"...не знаю как пацаны, а я не возражаю..." (с)

Может, xmltable все-таки подойдет?
...
Рейтинг: 0 / 0
09.11.2017, 14:24
    #39550252
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Универсальный разбор XML
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
09.11.2017, 14:35
    #39550267
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Универсальный разбор XML
dimyazуниверсальный парсер
Универсальность в чём? Пока что постановка вопроса из серии "у меня в подвале который год раздаётся странный стук".

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

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

Универсальность в том, чтобы не вытаскивать каждый тэг по отдельности.
Да, кол-ов столбцов может быть разное.
...
Рейтинг: 0 / 0
09.11.2017, 15:49
    #39550342
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Универсальный разбор XML
Универсальность разбора заканчивается на этом этапе
Код: 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
09.11.2017, 15:49
    #39550343
dimyaz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Универсальный разбор XML
dimyaz,

Просто как я могу решить эту задачу - это за ранее взять XML, вытащить все возможные в нем названия тэгов, и написать запрос который будет вытаскивать значение каждого тэга и заполнять столбец.
В этом наверно и вопрос, как вытащить названия всех тэгов.
...
Рейтинг: 0 / 0
09.11.2017, 16:07
    #39550357
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Универсальный разбор XML
А вот если забыть вытащить 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
09.11.2017, 16:43
    #39550380
Универсальный разбор XML
Код: 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
09.11.2017, 17:26
    #39550417
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Универсальный разбор XML
хрен редьки,

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

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


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