AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Jabber XMLStream parsen

Ein Thema von Luckie · begonnen am 20. Feb 2006 · letzter Beitrag vom 23. Feb 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 13:19
Jupp, hast Recht. So geht es:
Delphi-Quellcode:
procedure TForm1.GetTags(iter: IXMLIteratorEx; s: TStrings);
var
  xn : IXMLNode;
begin
  while iter.HasNext do
  begin
    xn := iter.Next;
    if xn.IsTag then
      with xn as IXMLTag do
      begin
        s.Add(Name+ ': ' + (xn as IXMLTag).Data);
        GetTags(children, s);
      end;
  end;
end;
Danke noch mal.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 16:00
Hm, noch ein kleines Problem:

Delphi-Quellcode:
function GetFontColor(iter: IXMLIteratorEx): string;
var
  xn : IXMLNode;
  s : string;
begin
  while iter.HasNext do
  begin
    xn := iter.Next;
    if xn.IsTag then
      with xn as IXMLTag do
      begin
        if xn.Name = 'colorthen
        begin
          s := (xn as IXMLTag).Data;
          ShowMessage(s);
          result := s;
        end;
        GetFontColor(children);
      end;
  end;
end;
Delphi-Quellcode:
s := GetFontColor(Tag.Children);
ShowMessage(s);
In der Funktion GetFontColor zeigt mir ShowMessage den String noch an. Nach dem Funktionsaufruf ist der Rückgabewert jedoch leer?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#13

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 16:06
Das Problem ist nun wirklich klein:

Delphi-Quellcode:
// ...
        if xn.Name = 'colorthen
        begin
          s := (xn as IXMLTag).Data;
          ShowMessage(s);
          result := s;
        end else
          Result := GetFontColor(children);
// ...
marabu
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 16:10
Ächtz. Acht Stunden am Stück vorm Computer sitzen scheint tötlich zu sein. Dank dir.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Jabber XMLStream parsen

  Alt 22. Feb 2006, 12:47
Jetzt wollte ich das in eine rekursive Funktion umbauen:
Delphi-Quellcode:
function GetTags(iter: IXMLIteratorEx): string;
var
  xn : IXMLNode;
begin
  while iter.HasNext do
  begin
    xn := iter.Next;
    if xn.IsTag then
      with xn as IXMLTag do
      begin
        result := (xn as IXMLTag).Name;
      end
    else
      result := GetTags((xn as IXMLTag).Children);
  end;
end;
Da bekomme ich aber in Zeile 14 den Fehler zur Laufzeit:
Zitat:
'Schnittstelle nicht unterstützt'.
Idee war es, das ganze in einem Treeview mit den entsprechenden Ebenen darzustellen, irgendwie oder so. Ich hätte dann noch eine globale Integer Variable mitgeführt, die entsprechend der Ebene hoch oder runtergesetzt wird oder so eben. Ich weiß noch nicht ganz genau, wie das gehen soll.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#16

Re: Jabber XMLStream parsen

  Alt 22. Feb 2006, 14:04
Hallo Michael,

vielleicht kannst du das an deine Bedürfnisse anpassen. Ist weit weg von perfekt, weil ich es schnell aus einem alten XML-Editor von mir heraus operiert und angepasst habe.

Grüße vom marabu
Angehängte Dateien
Dateityp: zip jabber_864.zip (2,9 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Jabber XMLStream parsen

  Alt 22. Feb 2006, 14:28
Danke. Werde ich mir mal angucken.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#18

Re: Jabber XMLStream parsen

  Alt 22. Feb 2006, 14:35
du prüfst in deiner if-abfrage ob es ein tag ist und im else-zweig nimmst du das objekt tortzdem als ixmltag daher?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#19

Re: Jabber XMLStream parsen

  Alt 23. Feb 2006, 09:10
Vergessen wir das erstmal. Das war noch eine ziemlich unausgereifte Idee.

Aber da gibt es noch ein Problem:
Delphi-Quellcode:
function GetTagValue(iter: IXMLIteratorEx; ATag: String): String;
var
  xn : IXMLNode;
begin
  while iter.HasNext do
  begin
    xn := iter.Next;
    if xn.IsTag then
      with xn as IXMLTag do
      begin
        if (xn as IXMLTag).Name = ATag then
        begin
          result := (xn as IXMLTag).Data;
          exit;
        end
        else
        begin
          result := GetTagValue(children, ATag);
        end;
      end;
  end;
end;
Diese Funktion soll mir den Inhalt eines Tags zurückgeben. So weit so gut. Funktioniert auch, aber nur einmal, beim ersten Mal. Das Problem wird dfaran liegen, dass ich den Paramter iter global deklarieren musste:
Delphi-Quellcode:
procedure TForm1.OnJabberMessage(Sender: TObject; const Msg: IJabberMsg; const Tag: IXMLTag);
var
  sl : TStringList;
begin
  XI := Tag.Children; // global!!!
Und dann der Aufruf:
Delphi-Quellcode:
procedure TForm1.cbTagsChange(Sender: TObject);
begin
  ShowMessage(cbTags.Text + ': ' + GetTagValue(XI, cbTags.Text));
end;
Ich denke, ich weiß, was passiert: XI steht nach dem Aufruf an der Stelle, an der er was gefunden hatte. Wie löse ich das Problem jetzt am geschicktesten?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#20

Re: Jabber XMLStream parsen

  Alt 23. Feb 2006, 15:32
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz