Привет всем!
Имеется класс который должен получать XML файл и выбирать из него инфу
Делаю так:
XMLDoc := TXMLDocument.Create(FileName);
XMLDoc.Active := true;
XMLDoc.DocumentElement; // возникает AV
XMLDoc.ChildNodes; //возникает AV
Причем строка
XMLDoc.XML.Text
содержит что надо и не вылетает
В чем может быть причина и как бороться?
Здравствуйте, katerina, Вы писали:
K>Имеется класс который должен получать XML файл и выбирать из него инфу
K>Делаю так:
K>K>XMLDoc := TXMLDocument.Create(FileName);
K>XMLDoc.Active := true;
K>XMLDoc.DocumentElement; // возникает AV
K>XMLDoc.ChildNodes; //возникает AV
K>
K>В чем может быть причина и как бороться?
Гнилой этот конструктор
constructor TXMLDocument.Create(const AFileName: DOMString);
Сделай вот так:
XMLDoc := TXMLDocument.Create(Application);
XMLDOc.LoadFromFile(FileName);
XMLDoc.Active := true;
XMLDoc.DocumentElement; // не возникает AV
XMLDoc.ChildNodes; // не возникает AV
Калабухов А.В.
Здравствуйте, kavlad, Вы писали:
K>Сделай вот так:
K>K> XMLDoc := TXMLDocument.Create(Application);
K> XMLDOc.LoadFromFile(FileName);
K> XMLDoc.Active := true;
K> XMLDoc.DocumentElement; // не возникает AV
K> XMLDoc.ChildNodes; // не возникает AV
K>
Огромное спасибо! Заработало!
Кстати об этом баге/фиче говорилось на
http://bdn.borland.com здесь.
Глюк связон с подсчетом ссылок в интерфейсах.
При вызове
TXMLDocument.Create(nil);
(а именно он и вызывается при TXMLDocument.Create(FileName); ) счетчик ссылок на интерфейс документа обнуляется, вот и возникает АВ.
Бороться как описано по ссылке:
var
Doc: IXMLDocument;
begin
Doc := TXMLDocument.Create(nil);
end;
Еще TXMLDocument любит вызов CoInitialize. Поэтому в приложение приходится вставлять Application.Initialize

Калабухов А.В.
Здравствуйте, kavlad, Вы писали:
K>Кстати об этом баге/фиче говорилось на http://bdn.borland.com здесь.
K>Глюк связон с подсчетом ссылок в интерфейсах.
K>При вызове
K>K>TXMLDocument.Create(nil);
K>
K>(а именно он и вызывается при TXMLDocument.Create(FileName); ) счетчик ссылок на интерфейс документа обнуляется, вот и возникает АВ.
K>Бороться как описано по ссылке:
K>K>var
K> Doc: IXMLDocument;
K>begin
K> Doc := TXMLDocument.Create(nil);
K>end;
K>
K>Еще TXMLDocument любит вызов CoInitialize. Поэтому в приложение приходится вставлять Application.Initialize
Спасибо, помагло