Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

XML as Registry [D6, D7, NT4, Win2k, WinXP]


Страницы:   1 2

id ©   (2006-10-16 09:59:00) 

Необходимо работать с XML,  как с реестром.
Например функция код Pascal/Delphi
WriteString('Main\Moto\Test', 'hello moto');
Должна записать в файл XML следующий код:Разметка XML

<Main>
<Moto>
 <Test>
  hello moto
 </Test>
</Moto>
</Main>

Причём если какие-либо записи уже существуют, то просто добавить.
И такой же вопрос с чтением. Помогите, пожалуйста, бьюсь с этим уже очень давно.

Начал я писать, но столкнулся с одной проблемой.
Код такой:
procedure Write(Path, Key, Value: string);
var
 N, P, K, root: IXMLNode;
 ts: TStringList;
 i: integer;
begin
 ts := TStringList.Create;
 ts.Delimiter := '/';
 ts.DelimitedText := Path;
 root := XML.DocumentElement;
 if root.ChildNodes.IndexOf(ts[0]) < 0 then
   N := root.AddChild(ts[0]) else
   N := root.ChildNodes.FindNode(ts[0]);
 for I := 1 to ts.Count - 1 do begin
   if N.ChildNodes.IndexOf(ts[i]) < 0 then
     P := N.AddChild(ts[i]) else P := N.ChildNodes.FindNode(ts[i]);
 end;
 K := P.AddChild(Key);
 K.Text := Value;
 ts.Free;
end;

Вызываю, например, так:
Write('Main/Hello/Moto/Love', 'Test2', '45645646');
Всё записывается, но есть один недостаток. Пишет так:

<Main>
<Hello/>
 <Moto/>
   <Love>
     <Test2>45645646</Test2>
   </Love>
 </Main>

А я хочу, чтоб писало вот так:

<Main>
 <Hello>
   <Moto>
     <Love>
       <Test2>45645646</Test2>
     </Love>
   </Hello>
 </Moto/>
</Main>

Т.е нет закрывающего тега для тегов без параметров. И теги без параметров не выстраиваются "лесенкой".
Подскажите, пожалуйста, как быть?


id   (2006-10-16 10:36:00) [21]

Извините, но Вы бы не могли мне помочь с чтением?
Пытаюсь так:

function TForm2.Read(Path, Key: string): string;
var
 N, P, K, root: IXMLNode;
 ts: TStringList;
 i: integer;
 NodeAr: array of IXMLNode;
begin
 ts := TStringList.Create;
 ts.Delimiter := '/';
 ts.DelimitedText := Path;
 SetLength(NodeAr, ts.Count - 1); //-1 т.к первый элемент не использутеся
 root := XML.DocumentElement;
 if root.ChildNodes.IndexOf(ts[0]) >= 0 then
   NodeAr[0] := root.ChildNodes.FindNode(ts[0]) else begin Result := ''; exit; end;
 for I := 1 to ts.Count - 1 do begin
   NodeAr[i] := NodeAr[i - 1].ChildNodes.FindNode(ts[i]);
 end;
 K := NodeAr[Length(NodeAr)-1].ChildNodes.FindNode(Key);
 Result := K.NodeValue;
 ts.Free;
end;


Slym   (2006-10-16 10:34:00) [22]

procedure Write(const Path, Key, Value: string);
var
 ts: TStringList;
 Node:IXMLNode;
 i:integer;
begin
 ts := TStringList.Create;
 try
   ts.Delimiter := '/';
   ts.DelimitedText := Path;
   Node:=XML.DocumentElement;
   for i:=0 to ts.Count-1 do
   begin
     if Node.ChildNodes.IndexOf(ts[i])<0 then
       Node:=Node.AddChild(ts[i])
     else
      Node:=Node.ChildNodes.FindNode(ts[i]);
   end;
 finally
   ts.Free;
 end;
 Node:=Node.AddChild(Key);
 Node.Text:=Value;
end;

procedure WriteEx(const Path, Key:string;const Value: variant);
var
 ts: TStringList;
 Node:IXMLNode;
 i:integer;
begin
 ts := TStringList.Create;
 try
   ts.Delimiter := '/';
   ts.DelimitedText := Path;
   Node:=XML.DocumentElement;
   for i:=0 to ts.Count-1 do
   begin
     if Node.ChildNodes.IndexOf(ts[i])<0 then
       Node:=Node.AddChild(ts[i])
     else
      Node:=Node.ChildNodes.FindNode(ts[i]);
   end;
 finally
   ts.Free;
 end;
 Node:=Node.AddChild(Key);
 Node.Attributes['VarType']:=VarType(Value);
 Node.Text:=VarToStr(Value);
end;


id   (2006-10-16 10:32:00) [23]

Спасибо огромное. Казалось бы такая мелочь, но как я с ней замучался.


_RusLAN   (2006-10-16 10:29:00) [24]

> [1] _RusLAN ©   (16.10.06 10:26)

и в строке
K := P.AddChild(Key);
тоже P замените на N


_RusLAN   (2006-10-16 10:26:00) [25]

у вас просто тег Love не входит в тег Moto, а тег Moto, в свою очередь, не входит в тег Hello.
Вы их добавляете просто в корень документа (и зря вы в примере сделали им отступ), так как N ссылается на корень.
Попробуйте так

N:= N.AddChild(ts[i]) else N:= N.ChildNodes.FindNode(ts[i]);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо