powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание xml
25 сообщений из 45, страница 1 из 2
Создание xml
    #39481721
igor_prg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, ALL.
с xml раньше не работал. А тут понадобилось создать xml-файл.
Нашел в интернете рабочий способ:
Код: pascal
1.
2.
3.
4.
5.
6.
  Xml:=TXMLDocument.Create(nil);
  Xml.Active:=false;
  with Xml do begin
    Active := true;
    Version := '1.0';
    Encoding := 'windows-1251';[SRC DELPHI]


end;
with xml do
begin
with AddChild('primer') do ...
[/SRC]
Но все работает при небольшом объеме данных выгрузки.
А при большом выбрасывает ошибку, что не хватает памяти.
Типа 32-разрядное приложение не может занимать память больше 2 гигов.
Слыхал, что есть другие способы создания xml-файлов, без хранения
всего дерева. Спасибо.
...
Рейтинг: 0 / 0
Создание xml
    #39481747
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igor_prg,

Google, "direct XML writer". Например, OmniXML пишет что в нём есть, но я лично им не пользовался.
...
Рейтинг: 0 / 0
Создание xml
    #39481751
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самый быстрый и простой способ записи конкретного XML в файл - это просто запись текста в файл
XML это обычный текст. Ничего не мешает его писать как обычный текст.
TStreamWriter очень удобно подходит например
...
Рейтинг: 0 / 0
Создание xml
    #39481759
igor_prg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 alekcvp
Спасибо.

2 krapotkin
Я так в самом начале и сделал. Но если в тексте будут какие-то спецсимволы
(типа "&"), то xml файл не пройдет валидность
...
Рейтинг: 0 / 0
Создание xml
    #39481796
igor_prg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://wiki.freepascal.org/XML_Tutorial/ru
модули DOM и XMLWrite из freepascal могут быть использованы в delphi?
...
Рейтинг: 0 / 0
Создание xml
    #39481860
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я давно агитирую местных, давайте напишем парсер и писатель XML на платформе CachedTexts. Аналогов по скорости не будет. Но желающих помогать нет, а без помощи я ещё фиг знает когда этим займусь
...
Рейтинг: 0 / 0
Создание xml
    #39481879
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igor_prgбудут какие-то спецсимволы
ну так мы же сами пишем текст. сами и спецсимволы заменим
их всего-то десяток
...
Рейтинг: 0 / 0
Создание xml
    #39482078
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мой вариант преобразования текстовой строки в XML-строку с учетом спецсимволов:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
/// <summary>
///   Конвертация строки в XML-строку
/// </summary>
/// <param name="ASource">
///   Исходная строка
/// </param>
/// <returns>
///   Строка в формате XML
/// </returns>
function ConvertToXmlString(const ASource: string): string;
var
  I: Integer;
begin
  // инициализируем
  Result := '';
  // по каждому символу
  if Length(ASource) > 0 then
  begin
    for I := Low(ASource) to High(ASource) do
    begin
      case ASource[I] of
        '<': Result := Result + '<';
        '>': Result := Result + '>';
        '"': Result := Result + '"';
        '&': Result := Result + '&';
      else
        // просто добавляем
        Result := Result + ASource[I];
      end;
    end;
  end;
end;



и простейший пример прямой записи в XML-файл:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure SaveToFile(const AFileName: string): Integer;
var
  IntlFile: System.Classes.TStringList;
begin
  IntlFile := System.Classes.TStringList.Create;
  try
    // обязательный заголовок файла в XML-формате
    IntlFile.Add('<?xml version="1.0" encoding="utf-16" standalone="yes"?>');
    // простейшее тело документа
    IntlFile.Add('<Group title="' + ConvertToXmlString('вот такой <КЛАССНЫЙ со спецсимволами> заголовок') + '">');
    IntlFile.Add('</Group>');
    // записываем в Unicode, поддерживаются все языки, включая китайский, иврит, еще много других неизвестных мне
    IntlFile.SaveToFile(AFileName, TEncoding.Unicode);
  finally
    IntlFile.Free;
  end;
end;
...
Рейтинг: 0 / 0
Создание xml
    #39482082
autp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот и глюк форума, он не правильно отобразил часть исходников)))) имелось ввиду следующее:

case ASource[I] of
'<': Result := Result + '<';
'>': Result := Result + '>';
'"': Result := Result + '"';
'&': Result := Result + '&';
else
// просто добавляем
Result := Result + ASource [I];
end;
...
Рейтинг: 0 / 0
Создание xml
    #39482086
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
емое, попробую еще раз:

case ASource[I] of
'<': Result := Result + '& l t ; ' ;
'>': Result := Result + '& g t ; ' ;
'"': Result := Result + '& q u o t ; ' ;
'&': Result := Result + '& a m p ; ' ;
else
// просто добавляем
Result := Result + ASource[I];
end;

убрать пробелы, где выделено жирным шрифтом
...
Рейтинг: 0 / 0
Создание xml
    #39482130
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
и простейший пример прямой записи в XML-файл:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure SaveToFile(const AFileName: string): Integer;
var
  IntlFile: System.Classes.TStringList;
begin
  IntlFile := System.Classes.TStringList.Create;
  try
    // обязательный заголовок файла в XML-формате
    IntlFile.Add('<?xml version="1.0" encoding="utf-16" standalone="yes"?>');
    // простейшее тело документа
    IntlFile.Add('<Group title="' + ConvertToXmlString('вот такой <КЛАССНЫЙ со спецсимволами> заголовок') + '">');
    IntlFile.Add('</Group>');
    // записываем в Unicode, поддерживаются все языки, включая китайский, иврит, еще много других неизвестных мне
    IntlFile.SaveToFile(AFileName, TEncoding.Unicode);
  finally
    IntlFile.Free;
  end;
end;


а ты вообще топикстартера читал ?
igor_prg А при большом выбрасывает ошибку, что не хватает памяти.
Типа 32-разрядное приложение не может занимать память больше 2 гигов.
...
Рейтинг: 0 / 0
Создание xml
    #39482148
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr

конечно я читал топик ТС и прекрасно понимаю суть проблемы, т.к. сам с ней сталкивался на заре начала работы с XML-документами. А суть проста - TXmlDocument очень прожорлив к памяти и из за этого видимо очень тормознут. Записывая тот же самый документ через (например!) TStringList, мы используем памяти как минимум в 10 раз меньше. И чем разветвленнее документ (т.е. чем больше вложенности)), тем он больше жрет памяти при работе через TXmlDocument.

Ну и никто не запрещает записывать результирующий файл кусками, а не собирать его в памяти. ТС направления для работы выданы, я считаю))
...
Рейтинг: 0 / 0
Создание xml
    #39482216
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знаю одну контору которая тоже очень любит xml как обычные текстовые файлы создавать. Проблема в том что потом эти текстовые файлы периодически не проходят проверку по xsd схеме :))
...
Рейтинг: 0 / 0
Создание xml
    #39482220
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне понравился модуль (бесплатный) SimpleXML. Правда на большие объемы его не проверял.
...
Рейтинг: 0 / 0
Создание xml
    #39482249
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любой компонент или библиотека нужны лишь для разбора структурированного хранения XML
здесь эта задача вообще не стоит
зачем тогда сверхдвижения?
...
Рейтинг: 0 / 0
Создание xml
    #39482251
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндиЗнаю одну контору которая тоже очень любит xml как обычные текстовые файлы создавать. Проблема в том что потом эти текстовые файлы периодически не проходят проверку по xsd схеме :))

Можно подумать, что при создании через DOM файлы будут гарантировано проходить проверку и валидация выполняется в момент создания xml-файла.
...
Рейтинг: 0 / 0
Создание xml
    #39482362
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igor_prg,

Недавно обсуждали тут быструю запись XML
Мой вариант оказался в 15 быстрее кода автора. И наверное раз в 50 быстрее решений, которые тебе здесь предлагают

Можешь попытаться разобраться
20576292
...
Рейтинг: 0 / 0
Создание xml
    #39482388
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
твой код в 50 раз быстрее, чем простое заполнение tstringlist и запись в файл?)))
...
Рейтинг: 0 / 0
Создание xml
    #39482402
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2,

да, это правда.
Тут многие тестировали его код - так hdd просто взрывались: скорость записи в десятки раз превышает предельную скорость, на которую рассчитано оборудование.
...
Рейтинг: 0 / 0
Создание xml
    #39482409
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД

я скорость данной библиотеки не проверял, но исходники внимательно посмотрел.
слабые места библиотеки:
- использование приведений pointer() - кроссплатформенность не в почете?
- использование label - сразу вспомнились времени turbo pascal 7.0 и delphi 1.0

для справедливости я соглашусь, что операции с текстовыми строками дорогие в плане тиков, поэтому работа с фиксированным буфером в памяти с периодическим скидыванием очередной сформированной части буфера в файл (используя кэширование) будет самым быстрым.

проверим :-)
...
Рейтинг: 0 / 0
Создание xml
    #39482424
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
writeln + settextbuf и не надо никакого стороннего кода. Быстро.
...
Рейтинг: 0 / 0
Создание xml
    #39482443
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЯ давно агитирую местных, давайте напишем парсер и писатель XML на платформе CachedTextsПоделиться своим парсером? Писал многопоточный читатель/писатель. Читатель поддерживает кучу кодировок, писатель пишет только в UTF-8. Не поддерживается запись комментариев и не поддерживаются пространства имен
...
Рейтинг: 0 / 0
Создание xml
    #39482684
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Выложи в эту ветку, пожалуйста: http://www.sql.ru/forum/1204260/oficialnyy-reliz-biblioteki-cachedtexts
Вообще наиболее эффективный формат такой разработки я представляю себе как "в четыре руки". То есть один запаривается над архитектурой и скоростью, второй определяет (уточняет) правила и проверяет корректность выполнения кода, может быть через юнит тесты. Подумай, может быть потянешь такой формат.
...
Рейтинг: 0 / 0
Создание xml
    #39482688
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2 SOFT FOR YOU
твой код в 50 раз быстрее, чем простое заполнение tstringlist и запись в файл?)))

Разумеется. Вот здесь был тест на запись 100Мб: http://www.sql.ru/forum/1178076-a/oficialnyy-reliz-cachedbuffers
На 1Гб разница будет колоссальная, и то, TStringList сработает только на x64
...
Рейтинг: 0 / 0
Создание xml
    #39482690
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. В тесте как раз разница в 50 раз относительно TStringList :)
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание xml
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]