powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как распарсить xmltype'ом xml произвольной вложенности?
25 сообщений из 35, страница 1 из 2
Как распарсить xmltype'ом xml произвольной вложенности?
    #39276908
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток! Извините, если это уже хренолионный вопрос по этой теме, но на форуме я не нашел ответа. Приведите пожалуйста пример, как распарсить xml неизвестной вложенности. Есть таблица, в ней столбец с блобами содержащими xml портянки. В этих xml портянках меня интересуют такие узлы: <xsl:text> что то на кириллице </xsl:text>. С xmltype я более менее разобрался, но как в этой ситуации выпарсить текст из узлов не знаю.
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39276912
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirВ этих xml портянках меня интересуют такие узлы: <xsl:text> что то на кириллице </xsl:text>
Код: plsql
1.
'//…'
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39276919
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirВсем доброго времени суток! Извините, если это уже хренолионный вопрос по этой теме, но на форуме я не нашел ответа. Приведите пожалуйста пример, как распарсить xml неизвестной вложенности. Есть таблица, в ней столбец с блобами содержащими xml портянки. В этих xml портянках меня интересуют такие узлы: <xsl:text> что то на кириллице </xsl:text>. С xmltype я более менее разобрался, но как в этой ситуации выпарсить текст из узлов не знаю.
функция extractvalue
пример:
Код: xml
1.
2.
3.
4.
5.
6.
<root>
<узел1>
<узел2>qq</узел2>
<узел2>ww</узел2>
</узел1>
</root>


Код: plsql
1.
select extractvalue(<поле xmltype>,'/root/узел1/узел2') as d from table


вернёт
dqqww
если узел именован, то добавляется пространство имён, т.е.
если xmltype вида
Код: xml
1.
2.
3.
4.
5.
6.
<root id="чего-то">
<узел1>
<узел2>qq</узел2>
<узел2>ww</узел2>
</узел1>
</root>


то
Код: plsql
1.
select extractvalue(<поле xmltype>,'/root/узел1/узел2','id="чего-то"') from table



вкратце так
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39276923
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelесли узел именован, то добавляется пространство имён, т.е.
если xmltype вида
Код: xml
1.
<root id="чего-то">

Какой-то бред.
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39276950
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicFogelесли узел именован, то добавляется пространство имён, т.е.
если xmltype вида
Код: xml
1.
<root id="чего-то">

Какой-то бред.

Код: xml
1.
<root xmln="чего-то">
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39276966
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
<root xmlns="чего-то">
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39277012
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Делаю так t.xml.extract('//xsl:text/text()'). Вылетает ошибка:

ORA-31011: сбой разбора XML
ORA-19202: Возникла ошибка при обработке XML
LPX-00601: Invalid token in: '//xsl:text/text()'

Что я делаю не так?
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39277034
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirДелаю так t.xml.extract('//xsl:text/text()'). Вылетает ошибка:
Код: plsql
1.
2.
3.
4.
5.
SQL> select xmltype('<z><x:text xmlns:x="aaaa">aBc</x:text></z>').extract('//y:text/text()', 'xmlns:y="aaaa"') from dual;

XMLTYPE('<Z><X:TEXTXMLNS:X="AAAA">ABC</X:TEXT></Z>').EXTRACT('//Y:TEXT/TEXT()','XMLNS:Y="AAAA"')
----------------------------------------------------------------------------------------------------
aBc
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39277062
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Огромное спасибо, теперь работает!
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39277114
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

ответьте, пожалуйста, еще на такой вопрос. Текст я выпарсил, но он в самом xml изначально отображается в виде иероглифов. Как мне правильно конвертнуть его или исходную xml портянку, чтобы получить кириллицу?

Делаю так, ничего не выходит. Ткните, что почитать надо.

Код: plsql
1.
2.
SELECT XMLROOT(xmltype(t.col1.getblobval(nls_charset_id('UTF8')), nls_charset_id('CL8MSWIN1251')), VERSION '1.0" encoding="utf-8')
FROM zzz.temptable t;
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39277117
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirДелаю так, ничего не выходит. Ткните, что почитать надо.Конструктор xmltype.
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39277583
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

с конструктором разобрался, все работает, кириллица отображается как надо, но xmltype не все xml портянки проглатывает.

Делаю так:
Код: plsql
1.
2.
3.
-- в t.data содержатся блобы с xml
select xmltype(t.data, 871) 
from temptable  t where t.doc_format_id = 6 and t.culture_code = 'ru'



Вылетает ошибка:

ORA-31011: сбой разбора XML
ORA-19213: возникла ошибка при обработке XML в строках 1
LPX-00210: expected '<' instead of '$'
ORA-06512: на "SYS.XMLTYPE", line 283
ORA-06512: на line 1

В интернетах ответ не нашел как поправить эту ошибку. Ткните носом, пожалуйста, что почитать
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39277601
israelshamirДелаю так:
Код: plsql
1.
2.
3.
-- в t.data содержатся блобы с xml
select xmltype(t.data, 871) 
from temptable  t where t.doc_format_id = 6 and t.culture_code = 'ru'



Вылетает ошибка:

ORA-31011: сбой разбора XML
ORA-19213: возникла ошибка при обработке XML в строках 1
LPX-00210: expected '<' instead of '$'
ORA-06512: на "SYS.XMLTYPE", line 283
ORA-06512: на line 1

В интернетах ответ не нашел как поправить эту ошибку. Ткните носом, пожалуйста, что почитать
почитайте первую строку возвращаемого значения запросом
Код: plsql
1.
2.
select t.data.getclobval() 
from temptable  t where t.doc_format_id = 6 and t.culture_code = 'ru'
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39277610
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
элементарно, ватсон,

Судя по всему у вас синтаксис не правильный:

ORA-22806: не является объектом или REF

Я пробовал так:

Код: plsql
1.
2.
select [color=red]xmltype(t.data, 871) .getclobval() [/color]
from temptable  t where t.doc_format_id = 6 and t.culture_code = 'ru'



Но:
ORA-31011: сбой разбора XML
ORA-19213: возникла ошибка при обработке XML в строках 1
LPX-00210: expected '<' instead of '$'
ORA-06512: на "SYS.XMLTYPE", line 283
ORA-06512: на line 1

Также пробовал взять блоб(в нем xml поменьше) из этой таблицы и сунуть в другую темповую, так вот для нее все работает. Судя по всему битые xml в других блобах либо какие то спецсимволы мешают.
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39277638
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirЯ пробовал так:
Код: plsql
1.
select xmltype(t.data, 871) .getclobval()

Код: plsql
1.
select dbms_lob.substr(t.data, 100)
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278376
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
Думаю, вы подразумевали более простое решение, но нашел пример с dbms_lob.substr, блобы в xml type конвертнуть получается, но:
Код: 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.
-- конвертим блоб в xml type
declare
v_clob    CLOB;
v_varchar VARCHAR2(32767);
v_start   PLS_INTEGER := 1;
v_buffer  PLS_INTEGER := 32767;
blob_in   blob;
x         xmltype;
BEGIN
DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
 
 select t.data into blob_in from zzz.temptable  t where t.doc_template_id = 100 and t.doc_format_id = 6 and t.culture_code = 'ru';
 
 FOR i IN 1 .. CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer) LOOP
 
   v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in,
                                                         v_buffer,
                                                         v_start));
 
   DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
 
   v_start := v_start + v_buffer;
 END LOOP;
 
 x := xmltype.createxml(v_clob);
 dbms_output.put_line(x.getclobval());
 
-- меняю кодировку, чтоб вместо иероглифов отображалась кириллица
[color=red]

select xmltype (x ,871)
from dual;

[/color]

end;



Получаю ошибку. Помогите, пожалуйста, разобраться.

ORA-06550: Строка 27, столбец 8:
PLS-00306: wrong number or types of arguments in call to 'XMLTYPE'
ORA-06550: Строка 27, столбец 8:
PL/SQL: ORA-00904: "SYS"."XMLTYPE"."XMLTYPE": недопустимый идентификатор
ORA-06550: Строка 27, столбец 1:
PL/SQL: SQL Statement ignored
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278378
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
israelshamir,

не пойму как тут текст подсвечивать, какой то креп получился опять
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278389
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirДумаю, вы подразумевали более простое решениеЧудак, не предполагай, а дословно исполняй то, что тебе предлагают, чтобы мы могли помочь тебе убедиться, что у тебя в этом blob-е какашка, раз уж ты никак не можешь поверить Oracle-у.
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278450
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Код: plsql
1.
select dbms_lob.substr(t.data, 100)



Вот результат:

3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D38223F3E0D0A3C78736C3A7374796C6573686565742076657273696F6E3D22312E302220786D6C6E733A78736C3D22687474703A2F2F7777772E77332E6F72672F31
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278468
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirВот результат:
Код: plaintext
1.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1 
Вэтом куске косяка не видно.
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278488
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Код: xml
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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output omit-xml-declaration="yes"/>
	<xsl:template match="/uuu-uuuuuuu">

		<xsl:variable name="currencyFormat">
			<xsl:choose>
				<xsl:when test="./client='zzzzz'">
					<xsl:text>0</xsl:text>
				</xsl:when>
				<xsl:when test="./client='xxxxx'">
					<xsl:text>0.0000</xsl:text>
				</xsl:when>
				<xsl:otherwise>
					<xsl:text>0.00</xsl:text>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:variable>
		<xsl:variable name="ppppppp" select="format-number(translate(./current_ppppppp/current_ppppppp,&quot;,&quot;,&quot;.&quot;),$currencyFormat)"/>

		<xsl:if test="./doc_type = '97' or ./doc_type = '659'">
			<xsl:choose>
				<xsl:when test="./client='iiiiii'">
					<xsl:choose>
						<xsl:when test="./usage &lt;= 0">
							<xsl:text>гнпеаквчарпенголд </xsl:text>
							<xsl:value-of select="./current_date/current_date"/>
							<xsl:text> ррооло </xsl:text>
							<xsl:value-of select="$ppppppp"/>
							<xsl:text> </xsl:text>
							<xsl:value-of select="./cur/cur"/>
							<xsl:text>. гоперап.</xsl:text>
						</xsl:when>
						<xsl:otherwise>
							<xsl:text>невуыекнгол </xsl:text>
							<xsl:value-of select="$ppppppp"/>
							<xsl:text> </xsl:text>
							<xsl:value-of select="./cur/cur"/>
							<xsl:text>. лопаввыячрног </xsl:text>
						</xsl:otherwise>
					</xsl:choose>
				</xsl:when>

				<xsl:otherwise>
					<xsl:text>кеткерн </xsl:text>
					<xsl:value-of select="$ppppppp"/>
					<xsl:text> </xsl:text>
					<xsl:value-of select="./cur/cur"/>
					<xsl:text>. керткетькнт </xsl:text>
					<xsl:value-of select="./usage"/>
					<xsl:text>%.</xsl:text>
					<xsl:choose>
						<xsl:when test="./client='xxxxx'">
							<xsl:text/>
						</xsl:when>
						<xsl:when test="./client='zzzzz'">
							<xsl:text> уенркенркенр</xsl:text>
						</xsl:when>
						<xsl:otherwise>
							<xsl:text> кенркенркеп</xsl:text>
						</xsl:otherwise>
					</xsl:choose>
					<xsl:text>.</xsl:text>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:if>

		<xsl:if test="./doc_type = '98' or ./doc_type = '660'">
			<xsl:choose>
				<xsl:when test="./client='zzzzz' or ./client='xxxxx'">
					<xsl:text>укеукпеуен </xsl:text>
				</xsl:when>
				<xsl:otherwise>
					<xsl:text>уенркенркрн </xsl:text>
				</xsl:otherwise>
			</xsl:choose>
			<xsl:value-of select="$ppppppp"/>
			<xsl:text> </xsl:text>
			<xsl:value-of select="./cur/cur"/>
			<xsl:if test="./client='zzzzz'">
				<xsl:text> екнернеуке</xsl:text>
			</xsl:if>
			<xsl:text> шгрншгр </xsl:text>
			<xsl:value-of select="./current_date/current_date"/>
			<xsl:choose>
				<xsl:when test="./client='zzzzz' or ./client='xxxxx'">
					<xsl:text>. ывапцукпцукпе.</xsl:text>
				</xsl:when>
				<xsl:otherwise>
					<xsl:text>. уакпцукпцук.</xsl:text>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:if>
	</xsl:template>
</xsl:stylesheet>



Вот весь этот xml из blob'а. Я позаменял текст кое - где, чтобы мне анальную кару не устроили, ибо я стажер всего навсего
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278520
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirВот весь этот xml из blob'а.Это валидный xml. Сам мог бы убедиться.
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278569
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Таблица огроменная, в ней миллионы строк. Как быть в этой ситуации?
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278574
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirКак быть в этой ситуации?В какой ситуации? http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
Как распарсить xmltype'ом xml произвольной вложенности?
    #39278577
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

я попробовал взять оттуда пару десятков строк и прогнать

Код: plsql
1.
select xmltype(t.data, 871)



Работает как надо, но в каких то строках есть хреновые блобы
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как распарсить xmltype'ом xml произвольной вложенности?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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