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 1 von 3  1 23      
Benutzerbild von Luckie
Luckie

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

Jabber XMLStream parsen

  Alt 20. Feb 2006, 15:51
Ich lege mir beim Senden einer Nachricht ein paar extra Knoten in dem XMLStream an. Der sieht dann so aus:
XML-Code:
<message id="JCOM_2" to="mp@datawerk.de" from="mp-test@datawerk.de/DWJabberClient">
  <foobar type="mp-extra-tag">
    <color>clOlive</color>
  </foobar>
  <body>test</body>
</message>
Jetzt wollte ich den natürlich wieder auslesen und alle Tags erhalten. Also foobar, color und body. Ich habe versucht dies mit einer rekursiven Prozedur zu lösen, nur bleibe ich immer wieder stecken, weil ich entweder nicht den XMLTag bekomme oder den XMLIterator oder den Inhalt des Tags. Ich weiß auch gar noch nit, wie doe einzelnen Elemente zusammenarbeiten sollen: http://jabbercom.sourceforge.net/xmlcom.html

Das habe ich bisher:
Delphi-Quellcode:
procedure GetTags(AXMLIteratorEx: IXMLIteratorEx);
var
  XMLIterator: IXMLIteratorEx;
  XMLTag: IXMLTag;
  XMLNode: IXMLNode;
begin
  if AXMLIteratorEx.HasNext then
  begin
    XMLNode := AXMLIteratorEx.Next;
    if XMLNode.IsTag then
    begin
      ShowMessage(XMLNode.Name);
      GetTags(XMLTag.Query(XMLNode.Name));
    end;
  end;
end;
Hier noch ein anderer Versuch:
Delphi-Quellcode:
procedure TForm1.GetTags(AXMLIterator: IXMLIterator);
var
  XMLIterator : IXMLIteratorEx;
  XMLTag : IXMLTag;
  XMLNode : IXMLNode;
begin
  if AXMLIterator.HasNext then
  begin
    XMLNode := AXMLIterator.Next;
    if XMLNode.IsTag then
    begin
      ShowMessage(XMLNode.Name);
      XMLTag := JabberSession.CreateXMLTag;
      GetTags(XMLTag.Query(XMLNode.Name));
    end;
  end;
end;
Damit bekomme ich den tag "foobar" aber nicht mehr den Tag "color".

Ich habe auch schon versucht das ganze mit einem XMLTag oder XMLNode als Paramter aufzubauen, aber da bin ich immer genauso stecken geblieben.
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
 
#2

Re: Jabber XMLStream parsen

  Alt 20. Feb 2006, 17:00
Oder erstmal nicht rekursiv:
Delphi-Quellcode:
procedure TForm1.OnJabberMessage(Sender: TObject; const Msg: IJabberMsg; const Tag: IXMLTag);
var
  Nickname : string;
  XMLIteratorEx : IXMLIteratorEx;
  XMLNode : IXMLNode;
  XMLTagIterator : IXMLTagIterator;
  XMLTag : IXMLTag;
  XMLCData : IXMLCData;
  s : string;
begin
  if Assigned(JabberSession.Roster.FindUserID(Msg.FromJID)) then
    Nickname := JabberSession.Roster.FindUserID(Msg.FromJID).NickName;
  AddMsgToRTF(rtfMsg, clRed, Now, Nickname, Msg.Body);

  XMLIteratorEx := Tag.Children;
  while XMLIteratorEx.HasNext do
  begin
    XMLNode := XMLIteratorEx.Next;
    if XMLNode.IsTag then
    begin
      ShowMessage(XMLNode.Name);
      XMLIteratorEx := XMLTag.Query(XMLNode.Name);
      XMLNode := XMLIteratorEx.Next;
      if XMLNode.IsTag then
        ShowMessage(XMLNode.Name);
    end;
  end;
end;
Da bekomme ich in Zeile 22 eine AV und weiter geht es dann nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

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

Re: Jabber XMLStream parsen

  Alt 20. Feb 2006, 20:18
Hallo Michael,

leider habe ich keine Erfahrung im Umgang mit JabberCom, aber mein Gefühl sagt mir, dass es etwa so gehen könnte:

Delphi-Quellcode:
procedure GetTags(iter: IXMLIteratorEx);
var
  xn: IXMLNode;
begin
  while iter.HasNext do
  begin
    xn := iter.Next;
    ShowMessage(xn.Name);
    if xn.IsTag then with xn as IXMLTag do
      GetTags(Query('*'));
  end;
end;

procedure TDemoForm.JabberSessionMessage(ASender: TObject;
  const Msg: IJabberMsg; const Tag: IXMLTag);
begin
  with Msg.MsgTag do
    GetTags(Query('*'));
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Jabber XMLStream parsen

  Alt 20. Feb 2006, 22:53
Danke für deine Hilfe, ich werde das morgen an der Arbeit mal ausprobieren.
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
 
#5

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 09:09
Also so geht es erstmal ohne das sich eine AV bekomme:
Delphi-Quellcode:
procedure TForm1.GetTags(iter: IXMLIteratorEx);
var
  xn: IXMLNode;
begin
  while iter.HasNext do
  begin
    xn := iter.Next;
    if xn.IsTag then with xn as IXMLTag do
    begin
      ShowMessage(xn.Name);
      GetTags(Query('*'));
    end;
  end;
end;
Aber an den untergeordneten Tag von foobar komme ich immer noch nicht dran.
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
 
#6

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 09:39
Nachtrag: Ich habe jetzt daraus mal eine Funktion gemacht, denn die ShowMessage nützt mir ja nichts. ,)
Delphi-Quellcode:
function TForm1.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.Name;
      GetTags(Query('*'));
    end;
  end;
end;
Jetzt fehlt mir aber der erste Tag, nämlich foobar.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

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

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 10:22
Und ich habe immer noch keinen Test-Server am Laufen, aber schau mal:

Delphi-Quellcode:
procedure 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);
      GetTags(children, s);
    end;
  end;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  xt: IXMLTag;
  s: TStringList;
begin
  s := TStringList.Create;
  xt := Jabber.CreateXMLTag;
  with xt do
  begin
    Name := 'message';
    PutAttrib('id', 'JCOM_2');
    PutAttrib('to', 'mp@datawerk.de');
    PutAttrib('from', 'mp-test@datawerk.de/DWJabberClient');
    with AddTag('foobar') do
    begin
      PutAttrib('type', 'mp-extra-tag');
      AddBasicTag('color', 'clOlive');
    end;
    ShowMessage(xml);
    GetTags(children, s);
    ShowMessage(s.Text);
    s.Free;
  end;
end;
Ich habe deine Message nachgebaut und dann wieder analysiert. Da ich noch nicht weiß, ob die Methode Query() XPath expressions unterstützt, bin ich erstmal auf die property children ausgewichen. Klappt!

marabu
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 11:12
Hm, werde ich mir gleich mal angucken. Dank dir 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
 
#9

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 11:49
Prima das klappt wunderbar. Nur wie komme ich jetzt an die Daten von einem Tag dran?
Code:
<message id="JCOM_3" to="mp-test@datawerk.de" from="mp@datawerk.de/DWJabberClient">
  <foobar type="mp-extra-tag">
    <color>clOlive</color>
  </foobar><body/>
</message>
Beispielsweise hier an den Wert clOlive? IXMLTag hat zwar die Eigenschaft Data, die diesen Wert wohl enthalten soll, aber mir ist es bisher noch nicht gelungen ihm zu sagen von welchem Tag er den Wert ausgeben soll.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#10

Re: Jabber XMLStream parsen

  Alt 21. Feb 2006, 13:11
ixmltag.data wird wohl die daten des tags auslesen auf den das interface gerade zeigt und weil du die tags durch den iterator alle durchgehst kannst du auch einfach von jedem tag das data-attribut zurückgeben anstatt dem namen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 13:53 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