Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.23;
Скачать: CL | DM;

Вниз

Тип Ixmlnode и запись его в файл   Найти похожие ветки 

 
D@nger   (2008-10-16 07:57) [0]

Здравствуйте! Пишу программу для обработки xml файлов. Xml файлы подгружаю в программу списком и записываю XMLDocument.DocumentElement в переменную Ixmlnode и работаю уже с ней чтобы не зависеть от расположения загружаемого xml файла. Все работает нормально, но теперь этот массив из переменных типа Ixmlnode необходимо сохранить в файл, чтобы потом открыть и продолжить с ними работу, добавлять или удалять файлы из этого массива, но сохранить файл не получается из за переменной ixmlnode. Приведу код сохранения в файл:

type  Tfterrs=packed record
      tal2count:Integer;
      checked:boolean;
      name,count,date_create, size:string[255];
      xmlnode:Ixmlnode;
     end;

var table:array of Tfterrs;

function TFmain.savetable(path:string):boolean;
var i,r,k,j:integer;
   f:file of Tfterrs;
   str_table:Tfterrs;
begin
 result:=true;
 try
   assignfile(f,path);
   rewrite(f);
   r:=length(table)-1;
    for i:=0 to r do
    begin
     seek(f,i);
     str_table.tal2count:=r;
     str_table.name:=table[i].name;
     str_table.count:=table[i].count;
     str_table.date_create:=table[i].date_create;
     str_table.size:=table[i].size;
     str_table.xmlnode:=table[i].xmlnode;
     write(f,str_table);
    end;
 except
   result:=false;
 end;
 closefile(f);
end;


в таком виде код вообще не запускается, ругается что Tfterrs нуждается в финализации, что нельзя создавать типизированный файл где присутствут переменная типа Ixmlnode.

Тогда я решил в типе Tfrerrs заменить переменную ixmlnode на Tstream и записывать переменную ixmlnode из массива в поток и сохранить его в файле, а при открытии файла обратно переводить Tstream в Ixmlnode. Но так как у меня нет опыта работы с поточными переменными ничего у меня не получилось... делал так:

*****блин... извините за длинный вопрос ...********

 str_table.xmlstream:=Tmemorystream.Create;
xmldocument1.DocumentElement:=table[i].nodexml;
xmldocument1.SaveToStream(str_table.xmlstream);
write(f,str_table);

Причем я проверил .. в переменную str_table.xmlstream записываются данные, но в файл она не попадает.... Подскажите пожалуста как быть...


 
Palladin ©   (2008-10-16 08:43) [1]

как ты думаешь, что такое "поточная переменная"?


 
D@nger   (2008-10-16 08:52) [2]

Palladin ©   (16.10.08 08:43) [1]

как ты думаешь, что такое "поточная переменная"?

я читал что поточную переменную нужно воспринимать как файл в памяти ...


 
Palladin ©   (2008-10-16 09:12) [3]

Я не спрашиваю как ее воспринимать переменную, я спрашиваю, что такое "поточная переменная". Вообще говоря, такого понятия и не существует. Это все больные фантазии. Есть понятие класса. Есть понятие объекта - экземпляра класса. Твоя "поточная переменная" никакой, нафик, не "файл в памяти", это объект класса TStream, а точнее, одного из его наследников. Что такое идентификатор объекта? Это всего лишь 4 байта, LongWord - содержащие адрес в памяти по которому находится созданный экземпляр класса. Как видишь, пока никакими "файлами в памяти" не пахнет. Как ты думаешь, что запишется в файл если указать в Record переменную типа TStream? А вот эти, нафик (при последующем чтении) не нужные, 4 байта. С другой стороны, теперь уже перейдем к понятию "файл в памяти", у нас есть некоторое количество данных, размер которых не фиксирован. (Заметь, при работе с типизированными файлами, требуется Record, а размер Record <b?всегда фиксирован по определению, о чем ты должен был знать изучая, хотя бы, основы Паскаля). Следовательно, подход с использованием типизированных файлов, абсолютно ошибочен. И использовать нужно нетипизированные файлы, или те же потоки в виде TFileStream.


 
Поросенок Винни-Пух ©   (2008-10-16 09:27) [4]

Извращнулся так извращнулся.
В рекорд совать хмл структуру.
Наоборот не пробовал?


 
Поросенок Винни-Пух ©   (2008-10-16 09:58) [5]

str_table.xmlstream:=Tmemorystream.Create;
table[i].nodexml.OwnerDocument.SaveToStream(...);


 
D@nger   (2008-10-16 10:13) [6]


> Поросенок Винни-Пух ©   (16.10.08 09:58) [5]
>
> str_table.xmlstream:=Tmemorystream.Create;
> table[i].nodexml.OwnerDocument.SaveToStream(...);
>

спасибо ... попробую


 
Плохиш ©   (2008-10-16 11:52) [7]


> D@nger   (16.10.08 07:57)  

> Xml файлы подгружаю в программу списком и записываю XMLDocument.
> DocumentElement в переменную Ixmlnode и работаю уже с ней
> чтобы не зависеть от расположения загружаемого xml файла.

Хорошая трава...

> необходимо сохранить в файл

XMLDocument.SaveToFile


 
D@nger   (2008-10-16 12:22) [8]


>
> > необходимо сохранить в файл
>
> XMLDocument.SaveToFile


это сохранить только один xml файл , а у меня их несколько...я же написал список ... и к тому же вместе с файлом мне необходимо сохранить еще кое какие данные строкового типа ....



Страницы: 1 вся ветка

Текущий архив: 2008.11.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-1202270574
Дмитрий
2008-02-06 07:02
2008.11.23
THintWindow: подсказка, движущаяся за курсором.


15-1221834038
tesseract
2008-09-19 18:20
2008.11.23
Экономика


2-1223914104
NewSer2
2008-10-13 20:08
2008.11.23
Как проверить строки в DBGridEh и окрасить строки в нужный цвет?


2-1223872431
Fynjy
2008-10-13 08:33
2008.11.23
модуль печати


15-1222164477
Alkid
2008-09-23 14:07
2008.11.23
Недетерминистические алгоритмы