Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание xml / 25 сообщений из 45, страница 1 из 2
03.07.2017, 13:30:42
    #39481721
igor_prg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание xml
Здравствуйте, 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
03.07.2017, 13:54:58
    #39481747
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание xml
igor_prg,

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

2 krapotkin
Я так в самом начале и сделал. Но если в тексте будут какие-то спецсимволы
(типа "&"), то xml файл не пройдет валидность
...
Рейтинг: 0 / 0
03.07.2017, 14:43:13
    #39481796
igor_prg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание xml
http://wiki.freepascal.org/XML_Tutorial/ru
модули DOM и XMLWrite из freepascal могут быть использованы в delphi?
...
Рейтинг: 0 / 0
03.07.2017, 15:29:23
    #39481860
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание xml
Я давно агитирую местных, давайте напишем парсер и писатель XML на платформе CachedTexts. Аналогов по скорости не будет. Но желающих помогать нет, а без помощи я ещё фиг знает когда этим займусь
...
Рейтинг: 0 / 0
03.07.2017, 15:46:09
    #39481879
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание xml
igor_prgбудут какие-то спецсимволы
ну так мы же сами пишем текст. сами и спецсимволы заменим
их всего-то десяток
...
Рейтинг: 0 / 0
03.07.2017, 19:58:42
    #39482078
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание xml
мой вариант преобразования текстовой строки в 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
03.07.2017, 20:01:02
    #39482082
autp2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание xml
вот и глюк форума, он не правильно отобразил часть исходников)))) имелось ввиду следующее:

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

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
03.07.2017, 22:22:02
    #39482130
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание xml
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
03.07.2017, 23:00:37
    #39482148
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание xml
DimaBr

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

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

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

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

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

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

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

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

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

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

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


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