V1s1ter

Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Всем кто юзает NativeXml Я наткнулся на пару подводных камней при использовании NativeXml, хотел бы поделится решением. 1) Пусть файл был создан в одной версии программы которая не имела переменной IsUse и естественно не сохраняла ее в файле XML. Затем програму модифицировали и вней появилась переменная IsUse. При чтении "новой" программой файла созданного "старой" программой (процедура FindNode) на поиск несуществующего узла IsUse тратится много времени. 2) Пусть мы имеем похожую (первый пункт) ситуацию, но где-то там во вложенных узлах есть узел сохраняющий значение локально переменной IsUse. "Новая" программа читает файл и ищет в нем глобальную переменную IsUse, поскольку файл сформирован "старой" программой и в нем не сохранена глобальная IsUse в верхних уровнях, то процедура FindNode найдет на вложенных узлах локальную IsUse и в результате чтения файла глобальная IsUse присвоит значением локальной IsUse. Поэтому я добавил процедуру, которая ищет заданный узел только в текущем уровне, но не ищет во вложенных. Код: function TXmlNode.FindNodeStrict(const NodeName: UTF8String): TXmlNode; var i: integer; begin Result := nil; for i := 0 to NodeCount - 1 do begin if Nodes[i].CompareNodeName(NodeName) = 0 then begin Result := Nodes[i]; exit; end; end; end; | 3) Если файл создан одной версией программы, а читается новой версией программы, то возникают исключения, которых пользователь и не видит, но которые замедляют чтение файла в десятки раз. Пример, у меня файл около 3 мегабайт, там графика. Я добавил в каждый объект булевский параметр и новая версия программы пыталась его найти в старом файле - чтение заняло около 20 минут !!! Я вставил в процедуру ReadAttributeBool всего лишь оператор if, в результате файл прочитался за несколько секунд. Код: function TXmlNode.ReadAttributeBool(const AName: UTF8String; ADefault: boolean): boolean; var V: UTF8String; begin V := AttributeByName[AName]; try // в место простого Result := sdStringToBool(V); я добавил условный оператор if V = '' then Result := ADefault else Result := sdStringToBool(V); except Result := ADefault; end; end; | Добавлено: Естественно для остальных ReadAttributeXXXXX нужно сделать похожие изменения. | Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 13:47 15-08-2010 | Исправлено: V1s1ter, 13:48 15-08-2010 |
|