Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2010, 12:28   #1
altcore
Пользователь
 
Регистрация: 31.03.2010
Сообщений: 38
По умолчанию форматирование XML

Кто как форматирует XML c данными ?

Для создания XML использую класс IXMLDOMDocument2. При сохранении он формирует однострочный текстовый файл. В принципе при парсинге это не мешает, но хотелось бы сделать красиво. Значит по форматированию нашел эту заметку: http://support.softlab.ru/Portal/Sam...ple.asp?id=360.

Переписал себе что-то вроде:

Код:
procedure SaveXMLDocWithFormat(doc: IXMLDOMDocument2; sCoding: string; fName : string);
var
  doc2 : IXMLDOMDocument2;
  Writer :IMXWriter;
  Reader :ISAXXMLReader;
begin
doc2 := CoDOMDocument.Create;
doc2.async := false;
Writer := CoMXXMLWriter.Create;
Reader := CreateComObject(CLASS_SAXXMLReader) as ISAXXMLReader;

Writer.indent := true;
Writer.encoding := sCoding; //'UTF-8';
Writer.output := doc2;

Reader.putContentHandler((Writer) as ISAXContentHandler); 
Reader.putDTDHandler((Writer) as ISAXDTDHandler); 
Reader.putErrorHandler((Writer) as ISAXErrorHandler); 

Reader.parse(doc);
Writer.flush;
doc2.save(fName);

pReader := nil;
pWriter := nil;
XML форматируется, т.е. теги табулируются и переносятся на новые строки, но в форматированном файле отсутствует часть тегов! Причем при моей структуре исходного XML выходит примерно следующее:

Код:
<корень>
    <запись1>
        <тег1.1>
        <тег1.2>
        <тег1.3>
    </запись1>
    <запись2>
        <тег2.1>
        <тег2.2>
        <тег2.3>
    </запись2>
    <запись3>
        <тег3.1>
    </запись3>
</корень>
Т.е. пропадают несколько записей в последнем блоке.
altcore вне форума Ответить с цитированием
Старый 08.06.2010, 14:30   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Используя стандартный XML компонент, к-рый в поставке с Дельфи, я изменил одно свойство, не помню правда какое, и он стал переносить при сохранении в файл новые элементы на новую строку, а не лепить подряд. Ничего не пропадало.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 08.06.2010, 17:09   #3
altcore
Пользователь
 
Регистрация: 31.03.2010
Сообщений: 38
По умолчанию

Вы, наверное, имеете ввиду TXMLDocument с вкладки Internet. Насколько я помню, там нет поддержки XML Schema. А она мне нужна для валидации.
altcore вне форума Ответить с цитированием
Старый 09.06.2010, 13:29   #4
altcore
Пользователь
 
Регистрация: 31.03.2010
Сообщений: 38
По умолчанию

В общем с форматированием решил вопрос так:
Код:
...
 XMLDoc : TXMLDocument;
...

procedure SaveXML(doc: IXMLDOMDocument2; fName : string);
begin
  doc.loadXML(XMLDoc.FormatXMLData(doc.xml));
  doc.save(fName);
end;
Вышло даже слишком просто как-то )

Сейчас другой вопрос. Как IXMLDOMDocument2 сохранять в UTF-8 ?
Везде пишут, что он по умолчанию кодирует в юникод. Я даже добавил явное указание кодировки, однако при просмотре файла Notepad++ кодировка указана как "ANSI as UTF-8". Ну и при валидации проблемы вылазят, т.к. есть кириллические значения тегов.
altcore вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парсер XML, не видит XML тэги supercelt PHP 3 02.11.2009 19:18
форматирование столбца n22sn Microsoft Office Excel 1 30.09.2009 07:56
Форматирование диска С Ruska882009 Windows 5 20.03.2009 12:45
форматирование beygul Помощь студентам 13 07.02.2009 21:18
Форматирование ячейки Nando Microsoft Office Excel 1 18.02.2008 01:35