Текущий архив: 2008.05.18;
Скачать: CL | DM;
ВнизФорматирование XMLType в текст Найти похожие ветки
← →
ZeroDivide © (2007-12-07 12:14) [0]Сгенереный XMLType при XMLType.getclobval(res) возвращает clob в каком-то странном форматировании.
<tag1><tag2>БлаБла2</tag2><tag7>БлаБла2</tag7><tag3>
<tag4/>
<tag5/>
</tag3>
<tag6>БлаБла2</tag6></tag1>
Т.е. пустые теги он перенес на новые строчки и даже отступы проставил... но остальное идет одной строкой.
Разумеется, XML от этого не перестает быть XML-ем, но неплохо иметь еще и читабельность в обычном текстовом виде:
<tag1>
<tag2>БлаБла2</tag2>
<tag7>БлаБла2</tag7>
<tag3>
<tag4/>
<tag5/>
</tag3>
<tag6>БлаБла2</tag6>
</tag1>
Как?
XML генерится весь в Oracle, но при получении clob-a, может средствами Delphi можно отформатить текст?
Как?
← →
Кщд © (2007-12-07 13:10) [1]почему нельзя формировать в нужном виде на стороне Oracle?
← →
ANB © (2007-12-07 14:05) [2]ИКСМЛ можно отформатить на стороне оракла. Получается довольно красиво, но :
1. На 9.2 живет ошибка из-за которой отформаченный ИКСМЛ не конвертится в клоб. Поправили в 10, патчи на 9.2 гоняли, но, видимо, чегото не донакатили - не помогло.
2. В отформаченный ораклом ИКСМЛ не добавляется в заголовок пара нужных атрибутов. В результате файл нельзя открыть никаким стандартным парсером, кроме самого оракла. Приходится эти атрибуты "ручками" потом дописывать.
На делфи я готовых форматалок не видел
← →
ZeroDivide © (2007-12-07 14:33) [3]Вопрос: Как? Как отформатить на стороне оракла.
Весь xml генерится с помощью XmlElement, XmlForest, XmlAgg... etc..., но в клоб он пишется в одну строку. Текстовый файл смотреть жутко неудобно.... текстовая строка размером в 300к... длинная такая строка :))
На 9.2 живет ошибка из-за которой отформаченный ИКСМЛ не конвертится в клоб.
Все шикарно генерится и конвертится с патчем - 9.2.0.5
Поправили в 10
В 10-ке еще одна шикарная вещь появилась в виде evalname....!!! В 9-ке пришлось финты крутить, чтобы без нее обойтись.
Вопрос остается открытым: Как текст полученный текст теперь отформатить?
← →
ANB © (2007-12-08 16:09) [4]Значится :
1)
function FormatXML (p_XML xmltype, p_Encoding varchar2 default "Windows-1251")
return clob is
v_Src clob;
v_Dst clob;
v_R clob;
v_Main_Tag varchar2 (4000 char);
v_Pos integer;
v_Size_src integer;
v_Size_Dst integer;
begin
-- Отформатируем XML
select XMLroot (p_XML, VERSION "1.0").Getclobval ()
into v_Src
from dual;
-- Сформируем главнй тег
v_Main_Tag := "<?xml version="1.0" encoding="" || p_Encoding || ""?>";
-- Откроем лобики
dbms_lob.Createtemporary (v_Dst, true, dbms_lob.session);
dbms_lob.open (v_Src, dbms_lob.Lob_Readonly);
-- Запишем в целевой лобик правильную строку XML заголовка
dbms_lob.write (v_Dst, length (v_Main_Tag), 1, v_Main_Tag);
-- Найдем конец главного тега
v_Pos := instr (v_Src, chr (10));
-- Скопируем в целевой лобик все, кроме старого главного тега
v_Size_src := dbms_lob.Getlength (v_Src);
v_Size_Dst := dbms_lob.Getlength (v_Dst);
dbms_lob.copy (v_Dst, v_Src, v_Size_src - v_Pos, v_Size_Dst + 1, v_Pos);
-- Закроем лобики
dbms_lob.close (v_Src);
v_R := v_Dst;
dbms_lob.Freetemporary (v_Dst);
return v_R;
exception
when others then
-- Закроем лобики в случае ошибки, если они открыты
if (dbms_lob.isopen(v_Src) > 0) then
dbms_lob.close(v_Src);
end if;
if (dbms_lob.isopen(v_Dst) > 0) then
dbms_lob.close(v_Dst);
end if;
Common$Errors.Save_Error_Stack;
raise;
end;
2. Если ты раньше не знал, как хмл форматить, как ты мог наступить на граблю в 9.2 ? Кстати, у нас и был 9.2.0.7. Не помогало, на ХЕ перешли - все заботало. Вся проблема в том и была, что не конвертился именно формаченный хмл. Причем ошибка не всегда вылезала, а только для достаточно больших реальных файлов.
← →
ZeroDivide © (2007-12-10 09:08) [5]ANB © (08.12.07 16:09)
А в какой момент соббсно форматирование происходит в данной процедуре? Что-то я кроме прибивания <?xml version="1.0" encoding="" || p_Encoding || ""?> ничего интересного не увидел.
← →
ZeroDivide © (2007-12-10 09:16) [6]Я имел в виду что-то типа этого, только более грамотное (в данном случае - без открывающих/закрывающих <ROWSET>):
select SYS_XMLAGG(XMLType(
"<tag1><tag2>БлаБла2</tag2><tag3><tag4/><tag5/></tag3><tag6>БлаБла2</tag6></tag1>"
)).extract("/ROWSET").getClobVal() xml
from DUAL
← →
sniknik © (2007-12-10 10:48) [7]> Текстовый файл смотреть жутко неудобно....
а не смотри в тексте, открывай в IE или другим браузером.
имхо проще редактор просмотрщик/нормальный найти чем пытаться под блокнот хмл сформатировать.
← →
ZeroDivide © (2007-12-10 12:56) [8]
> имхо проще редактор просмотрщик/нормальный найти чем пытаться
> под блокнот хмл сформатировать.
>
Я этот xml, который в текстовом виде выглядит как одна строка, размером несколько десятков КБ, запихиваю в прогу, которая проверяет непосредственно значения в тегах, в случае ошибки, говорит что-нибудь, типа:
ошибка в строке 1, позиция 12345
Хотелось бы получать сообщения, наоборот, типа:
ошибка в строке 12345, позиция 5.... так как-то легче искать место ошибки, соответственно, нужно под блокнот отформатить
← →
ANB © (2007-12-10 13:52) [9]
> -- Отформатируем XML
> select XMLroot (p_XML, VERSION "1.0").Getclobval ()
> into v_Src
> from dual;
Всеж подписано :)
← →
ZeroDivide © (2007-12-10 15:47) [10]10gR2 introduces the xmlRoot operator to address this issue
У меня, как я писал 9.2.0.5
← →
ANB © (2007-12-10 15:56) [11]
> У меня, как я писал 9.2.0.5
тады обломайся с форматированием на стороне сервера.
Хм. Вообще то девятка у меня на компиляции не ругалась. Валилось все на извлечении отформаченного клоба.
← →
Reindeer Moss Eater © (2007-12-10 16:14) [12]Вариант:
Нарисовать xsl трансформацию для преобразования xml в текст.
И выполнить transform на стороне сервера.
Страницы: 1 вся ветка
Текущий архив: 2008.05.18;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.042 c