Hallo Michael,
das Problem hast du richtig erkannt, die Lösung ist denkbar einfach: Nicht das Iterator-Interface global speichern, sondern das Wurzel-Element.
Delphi-Quellcode:
procedure TForm1.OnJabberMessage(Sender: TObject; const Msg: IJabberMsg; const Tag: IXMLTag);
begin
self.MsgTag := Tag;
// ...
end;
Jetzt kannst du jederzeit GetTagValue(MsgTag, 'color') rufen und wirst auch gehört. Alternativ geht auch sowas:
Delphi-Quellcode:
function ParseStr(var s: string; delimiters: string; purge: boolean = true): string;
var
i: integer;
begin
i := 0;
while (i < Length(s)) and (Pos(s[Succ(i)], delimiters) = 0) do
Inc(i);
Result := Copy(s, 1, i);
Delete(s, 1, i + Ord(purge));
end;
function TDemoForm.GetData(tag: IXMLTag; path: String): String;
var
ti: IXMLTagIterator;
q: String;
begin
while Assigned(tag) and (path <> '') do
begin
q := ParseStr(path, '/');
ti := tag.QueryTag(q);
tag := ti.Next;
end;
if Assigned(tag)
then Result := tag.Data
else Result := '';
end;
procedure TDemoForm.QueryDataActionExecute(Sender: TObject);
begin
ShowMessage(GetData(MsgTag, 'foobar/color'));
end;
Grüße vom marabu