Автор: ArtemiyUO
Дата сообщения: 21.04.2006 06:06
Стоит проблема парсинга действительного большого ХМЛ фаила 50-200 мб.
Нужен SAX.
Сначала пробовал юзать МСХМЛ в сах режиме - не смог разобраться как применять, нигде нет примеров. Если у кого то реально есть рабочий пример. Пожалуйста дайте.
Пробовал SimpleXML - быстро, но не САХ, жрет немеренно памяти, не подходит.
Sax for Pascal, вроде хороший, но очень старый, постоянно какие то проблемы с установкой, постоянно среда кидает экзепекты из за него (Д7, Д10). Может есть у кого адаптированная версия к 7 или 10.
NativeXML - очень хороший, комерческий парсер. Заявлена работа в САХ режиме.
Щас на нем и работаю. НО работа в сах режиме не понятная - он дает указать обработчики, я парсю сам в обработчиках, но ПРИ ЭТОМ он паралельно строит в памяти весь документ. МНЕ ЭТОГО НЕ НАДО, он сжирает 1,5 гб рам(
Кто нибудь знает как заставить его не строить модель дока в памяти, а работать в САХ режиме полностью?
Вообщем хелп, уже склоняюсь к написанию своего примитивного САХ парсера(
Добавлено:
Вроде есть решение, из справки к нативхмл
Whenever a node is found, the OnNodeNew event is fired, and whenever a node is completely loaded, the OnNodeLoaded event is fired.
If you do not want to keep a complete copy of the XML file in memory, for example for huge XML files, you can directly remove the node and free its memory. In that case, add the following code to the OnNodeLoaded event:
procedure TForm1.DoNodeLoaded(Sender: TObject; Node: TXmlNode);
begin
Memo1.Lines.Add(Format('Loaded: Name=%s, Value=%s', [Node.Name, Node.ValueAsString]));
if Node.TreeDepth > 0 then begin
Memo1.Lines.Add(Format('Deleted: Name=%s', [Node.Name]));
Node.Delete;
end;
end;