![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
XML as Registry [D6, D7, NT4, Win2k, WinXP]
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]);