Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.018 c
2-1208284170
smartleds
2008-04-15 22:29
2008.05.18
Подскажите как удалить массив TrackBar-ов


2-1208623339
Alexey
2008-04-19 20:42
2008.05.18
Как свернуть форму


15-1207300558
legandr
2008-04-04 13:15
2008.05.18
Уравнение у пагодообразной крыши...


2-1203231941
DRAF
2008-02-17 10:05
2008.05.18
Полоса пкрутки


15-1207032765
Bober_crazy
2008-04-01 10:52
2008.05.18
1 апреля или правда?