Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Форматирование XMLType в текст


ZeroDivide ©   (2007-12-07 12:14:00) 

Сгенереный 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 можно отформатить текст?
Как?


Reindeer Moss Eater   (2007-12-10 16:14:00) [1]

Вариант:
Нарисовать xsl трансформацию для преобразования xml в текст.
И выполнить transform на стороне сервера.


ANB   (2007-12-10 15:56:00) [2]


> У меня, как я писал 9.2.0.5

тады обломайся с форматированием на стороне сервера.
Хм. Вообще то девятка у меня на компиляции не ругалась. Валилось все на извлечении отформаченного клоба.


ZeroDivide   (2007-12-10 15:47:00) [3]

10gR2introduces the xmlRoot operator to address this issue
У меня, как я писал 9.2.0.5


ANB   (2007-12-10 13:52:00) [4]


> -- Отформатируем XML
>    select XMLroot (p_XML, VERSION '1.0').Getclobval ()
>      into v_Src
>      from dual;

Всеж подписано :)


ZeroDivide   (2007-12-10 12:56:00) [5]


> имхо проще редактор просмотрщик/нормальный найти чем пытаться
> под блокнот хмл сформатировать.
>


Я этот xml, который в текстовом виде выглядит как одна строка, размером несколько десятков КБ, запихиваю в прогу, которая проверяет непосредственно значения в тегах, в случае ошибки, говорит что-нибудь, типа:
ошибка в строке 1, позиция 12345

Хотелось бы получать сообщения, наоборот, типа:
ошибка в строке 12345, позиция 5.... так как-то легче искать место ошибки, соответственно, нужно под блокнот отформатить


sniknik   (2007-12-10 10:48:00) [6]

> Текстовый файл смотреть жутко неудобно....
а не смотри в тексте, открывай в IE или другим браузером.

имхо проще редактор просмотрщик/нормальный найти чем пытаться под блокнот хмл сформатировать.


ZeroDivide   (2007-12-10 09:16:00) [7]

Я имел в виду что-то типа этого, только более грамотное (в данном случае - без открывающих/закрывающих <ROWSET>):

select SYS_XMLAGG(XMLType(
'<tag1><tag2>БлаБла2</tag2><tag3><tag4/><tag5/></tag3><tag6>БлаБла2</tag6></tag1>'
      )).extract('/ROWSET').getClobVal() xml
 from DUAL


ZeroDivide   (2007-12-10 09:08:00) [8]

ANB ©   (08.12.07 16:09)

А в какой момент соббсно форматирование происходит в данной процедуре? Что-то я кроме прибивания <?xml version="1.0" encoding="' || p_Encoding || '"?> ничего интересного не увидел.


ANB   (2007-12-08 16:09:00) [9]

Значится :
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-07 14:33:00) [10]

Вопрос: Как?Как отформатить на стороне оракла.
Весь xml генерится с помощью XmlElement, XmlForest, XmlAgg... etc..., но в клоб он пишется в одну строку. Текстовый файл смотреть жутко неудобно.... текстовая строка размером в 300к... длинная такая строка :))

На 9.2 живет ошибка из-за которой отформаченный ИКСМЛ не конвертится в клоб.

Все шикарно генерится и конвертится с патчем - 9.2.0.5

Поправили в 10
В 10-ке еще одна шикарная вещь появилась в виде evalname....!!! В 9-ке пришлось финты крутить, чтобы без нее обойтись.

Вопрос остается открытым: Как текст полученный текст теперь отформатить?


ANB   (2007-12-07 14:05:00) [11]

ИКСМЛ можно отформатить на стороне оракла. Получается довольно красиво, но :
1. На 9.2 живет ошибка из-за которой отформаченный ИКСМЛ не конвертится в клоб. Поправили в 10, патчи на 9.2 гоняли, но, видимо, чегото не донакатили - не помогло.
2. В отформаченный ораклом ИКСМЛ не добавляется в заголовок пара нужных атрибутов. В результате файл нельзя открыть никаким стандартным парсером, кроме самого оракла. Приходится эти атрибуты "ручками" потом дописывать.

На делфи я готовых форматалок не видел


Кщд   (2007-12-07 13:10:00) [12]

почему нельзя формировать в нужном виде на стороне Oracle?


Наверх

Титульная страница Поиск, карта сайта Написать письмо