Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.11.23;
Скачать: [xml.tar.bz2];

Вниз

Тип 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
2-1223632397
noob_one
2008-10-10 13:53
2008.11.23
Как передать параметром массив переменной длины


9-1175056682
Mr.Vlad
2007-03-28 08:38
2008.11.23
Media


15-1222063558
date
2008-09-22 10:05
2008.11.23
Работа с датами


15-1222332394
@!!ex
2008-09-25 12:46
2008.11.23
Чем можно сделать дамп памяти?


2-1223841694
Vayrus
2008-10-13 00:01
2008.11.23
Проблема с распаковкой архива





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский