Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Вниз

Форматирование 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.288 c
2-1208324876
Aleksandrrr
2008-04-16 09:47
2008.05.18
добавление файлов в проект


15-1207224227
@!!ex
2008-04-03 16:03
2008.05.18
Работы для дизайнера нет? Удаленно или в Самаре


11-1188313814
Demt
2007-08-28 19:10
2008.05.18
Динамическое создание PopupMenu


15-1207069375
TIF
2008-04-01 21:02
2008.05.18
1 апреля - ФИНАЛ БЛИЗОК... Включите "Время" на Первом


2-1208676738
Mag
2008-04-20 11:32
2008.05.18
Редактирование текстового файла. Замена части текста на другой.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский