Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Teile von XML auslesen und anzeigen (https://www.delphipraxis.net/100516-teile-von-xml-auslesen-und-anzeigen.html)

XXcD 29. Sep 2007 12:06


Teile von XML auslesen und anzeigen
 
Hallo,
ich möchte gerne eine XML Datei auslesen und bestimmte Teile davon in Labels anzeigen lassen.
Also z.b. Name, race, level usw.
Und untereinander sollen mehre Einträge angezeigt werden.

Zitat:

<plr>
<name>Name</name>
<race>11</race>
<class>1</class>
<gender>0</gender>
<pvprank>0</pvprank>
<level>70</level>
<map>0</map>
<areaid>150</areaid>
<xpos>-3739.530029</xpos>
<ypos>-618.171997</ypos>
<ontime>0 hours, 0 minutes, 26 seconds</ontime>
<latency>0</latency>
</plr>
Es sollen immer so viele Labels da sein wie Einträge da sind. Aber damit hab ich noch ein paar Probleme und wollte mal fragen ob mir da einer helfen kann.

semo 29. Sep 2007 14:03

Re: Teile von XML auslesen und anzeigen
 
ich hab da noch ein paar probleme, also ich bitet dich.
ein wenig genauer darf die definition schons ein.

XXcD 29. Sep 2007 16:41

Re: Teile von XML auslesen und anzeigen
 
naja muss das nicht so genau wissen. Wäre schonmal gut wenn einer ne Seite hätte wo man erklärt bekommt wie man XML Datein ausliest und verarbeitet(Also anzeigen lassen).

marabu 29. Sep 2007 18:54

Re: Teile von XML auslesen und anzeigen
 
Hi,

wenn du noch keine Erfahrung im Umgang mit XML-Dateien hast, dann sind vielleicht ein paar Tutorials angebracht. Hast du schon etwas Erfahrung, dann kennst du vielleicht auch schon verschiedene Zugriffstechniken: MSXML, OpenXML oder die IXML-Schnittstellen von Borland, welche vom verwendeten Parser abstrahieren. Und nicht zuletzt findest du im XML-Forum der DP fast in jedem Thread etwas Code, den du ansehen und ausprobieren kannst. Wichtig ist erstmal, dass du deine Benutzeroberfläche von den XML-Zugriffen entkoppelst.

Was ist jetzt dein Hauptproblem: Das Auslesen der Daten aus dem XML-Dokument oder das Einbringen der XML-Daten in deine Benutzeroberfläche?

Grüße vom marabu

XXcD 29. Sep 2007 19:29

Re: Teile von XML auslesen und anzeigen
 
Beides :-D
Ich müsste wissen wie ich die XMl Datei in Delphi öffnen kann also mit welcher Komponente und nen wenig quellcode dazu wäre nicht schlecht. Und wie ich die einzelnen Teile in Label anzeigen kann.

Edit: was ich noch sagen wollte, ich zeig hier mal nen Stück aus der XML Datei damit ihr euch mal nen Bild davon machen könnt:

Zitat:

<plr>
<name>Testspieler1</name>
<race>5</race>
<level>55</level>
</plr>
<plr>
<name>Testspieler2</name>
<race>1</race>
<level>15</level>
</plr>
Das soll hinterher so aussehen:
Zitat:

Testspieler1 5 55
Testspieler2 1 15

DGL-luke 29. Sep 2007 20:40

Re: Teile von XML auslesen und anzeigen
 
Bei Google suchenxmllib
Bei Google suchenThaXML
[dp]XML Lib*[/dp]

Da wird ihnen geholfen.

ulhau 29. Sep 2007 20:57

Re: Teile von XML auslesen und anzeigen
 
Hi,

Wenn die Ebebenen nicht tiefer als 2 sind, also nach Art von Ini-Dateien, dann bietet sich doch die Klasse "TXMLINI" an. Das funktioniert alles genauso wie bei "TINIFILE" und steht

hier: "http://sourceforge.net/projects/txmlini" zum Downloaden.

Und Tschüssss!!!

XXcD 29. Sep 2007 21:43

Re: Teile von XML auslesen und anzeigen
 
Also ich hab jetzt noch einiges gefunden, was mich aber nicht wirklich weiter bringt. Kann mir nicht einer nen Codeschnipzel geben, was nur eine bestimmte Spalte von der XML Datei ausliest.

Zitat:

<sessions>
<plr>
<name>Name</name>
<race>11</race>
<level>70</level>
</plr>
<plr>
<name>Name</name>
<race>11</race>
<level>70</level>
</plr>
<plr>
<name>Name</name>
<race>11</race>
<level>70</level>
</plr>
</sessions>
Ich möchte nur die Sachen auslesen die in Sessions stehen. Und dann soll jede plr Spalte in ein Label angezeigt werden. Die ganzen Links die hier gepostet wurden helfen mir da nicht wirklich weiter.

DGL-luke 29. Sep 2007 22:04

Re: Teile von XML auslesen und anzeigen
 
Hallo,

nein, wir können dir nicht ein Codeschnipsel geben. Denn es gibt zig Libraries, die XML Daten parsen, lesen und/oder schreiben können. Alle arbeiten irgendwie anders.

Ich empfehle dir die XMLLib: http://muetze1.de/?c=1&lang=ger

da wärs recht einfach:

Delphi-Quellcode:
Showmessage(xmllib.root.nodes[0].nodes.nodebyname('').value.asstring);
oder so ähnlich.

Ohne XML verstanden zu haben, hilft dir das aber nicht viel.

ulhau 29. Sep 2007 23:09

Re: Teile von XML auslesen und anzeigen
 
Hi,

ich nochmal. Ich glaube das mit:

<sessions>
<plr>
...
</plr>
<plr>
...
</plr>
<plr>
...
</plr>
</sessions>

funktioniert so nicht. Es wird immer nur die letzte Sektion angezeigt. Möglicherweise ist es so:

<sessions>
<plr1>
...
</plr1>
<plr2>
...
</plr2>
<plr3>
...
</plr3>
</sessions>

besser. Beim XML-Format müssen auch einige vorgaben beim benutzen von Schriftzeichen eingehalten werden.

Tschüsss !!!

semo 29. Sep 2007 23:59

Re: Teile von XML auslesen und anzeigen
 
Zitat:

Hi,

ich nochmal. Ich glaube das mit:

<sessions>
<plr>
...
</plr>
<plr>
...
</plr>
<plr>
...
</plr>
</sessions>

funktioniert so nicht. Es wird immer nur die letzte Sektion angezeigt.
sowas funktioniert auch.
man muss nur alle childnodes von <sessions> durchlaufen.

ulhau 30. Sep 2007 01:14

Re: Teile von XML auslesen und anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Also ich habe da mal einen kleinen Test angehängt.
Es kann ja sein das es schon reicht.

Aber jetzt "Nacht auch"!!!

marabu 30. Sep 2007 07:58

Re: Teile von XML auslesen und anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

Zitat:

Zitat von XXcD
... Kann mir nicht einer nen Codeschnipzel geben, was nur eine bestimmte Spalte von der XML Datei ausliest. ...

ich finde es zwar schade, dass du noch keine passende Idee für deine Benutzerschnittstelle vorgestellt hast, und auch beim Suchen nach Code-Beispielen hast du dich wohl etwas ungeschickt angestellt, aber ich hänge dir trotzdem eine Demo an. Sie liest deine Beispieldaten in ein Grid ein. Sobald du den Code nachvollzogen hast, solltest du in der Lage sein ihn an deine Bedürfnisse anzupassen.

Meine Demo ist selbst eine Anpassung des Codes aus XML komplett auslesen. Nur der Vollständigkeit wegen: Du kannst solche Daten auch mittels TClientDataSet verarbeiten - dann kommst du mit XML fast gar nicht in Berührung.

Freundliche Grüße

XXcD 30. Sep 2007 10:28

Re: Teile von XML auslesen und anzeigen
 
Der Anhang von marubu ist schon fast Perfekt. Das ist genau das was ich gesucht habe. Mein Problem ist aber noch wenn ich aus der ganzen XML Datei die Sessions Spalte verarbeiten will, dann wird da nichts angezeigt. Muss ich da noch was einstellen um verscheidene Ebenen zu verarbeiten?

marabu 30. Sep 2007 14:33

Re: Teile von XML auslesen und anzeigen
 
Hallo,

du solltest dein Problem nochmal mit anderen Worten beschreiben, denn eine Spalte gibt es in deinem XML-Dokument nicht. XML kennt Elemente und Attribute: <element attr="value"/>. Meine Demo geht von deinen Beispieldaten aus. Wenn die Echtdaten anders aussehen, dann musst du den Code anpassen oder bessere Beispieldaten zur Verfügung stellen.

Freundliche Grüße

XXcD 30. Sep 2007 14:39

Re: Teile von XML auslesen und anzeigen
 
Ok ich beschreibe das mal deutlicher.
Meine XMl Datei sieht kommplett so aus:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="server_stats.xsl"?>
<serverpage>
  <status>
    <platform>******************</platform>
    <uptime>0 days, 21 hours, 18 minutes, 1 seconds</uptime>
    <oplayers>2</oplayers>
    <cpu>0.00</cpu>
    <qplayers>0</qplayers>
    <ram>133.133</ram>
  </status>
  <sessions>
    <Player>
      <name>*****</name>
      <race>5</race>
      <class>1</class>
      <gender>1</gender>
      <pvprank>0</pvprank>
      <level>1</level>
      <map>0</map>
      <areaid>154</areaid>
      <xpos>1657.601685</xpos>
      <ypos>1678.327881</ypos>
      <ontime>0 hours, 1 minutes, 4 seconds</ontime>
      <latency>7</latency>
    </Player>
    <Player>
      <name>*****</name>
      <race>11</race>
      <class>1</class>
      <gender>0</gender>
      <pvprank>0</pvprank>
      <level>70</level>
      <map>0</map>
      <areaid>1617</areaid>
      <xpos>-8941.937500</xpos>
      <ypos>511.358368</ypos>
      <ontime>0 hours, 2 minutes, 44 seconds</ontime>
      <latency>1</latency>
    </Player>
  </sessions>
</serverpage>
Jetzt möchte ich die Player Namen in Labels haben und die labels sollen Dynamisch sein. Also immer soviele Labels wie auch Spieler online sind. Ich habe leider nicht viel erfahrung in dem Bereich XML in Delphi und wie man Labels dynamisch erstellt.

marabu 30. Sep 2007 14:51

Re: Teile von XML auslesen und anzeigen
 
Hallo,

in deinen ursprünglichen Beispieldaten war <sessions> das documentElement, in den Echtdaten liegt dieses Element eine Ebene tiefer, also musst du den Zugriff auf die Liste der <player> entsprechend anpassen:

Delphi-Quellcode:
// ...
      ExtractCells(documentElement.ChildNodes['sessions'].ChildNodes, StringGrid, FIELDNAMES);
// ...
Eine Komponente der Klasse TLabel kannst du leicht dynamisch erstellen, aber über die Platzierung musst du dir ein wenig Gedanken machen.

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  with TLabel.Create(self) do
  begin
    Parent := self; // oder ein anderes WinControl
    Caption := 'Dynamic';
    Left := 50;
    Top := 50;
  end;
end;
Ob TLabel wirklich so gut sind?

Freundliche Grüße

XXcD 30. Sep 2007 15:10

Re: Teile von XML auslesen und anzeigen
 
Ja das funtzt, vielen Dank. Aber wenn ich das jetzt mit Labels machen will, was muss ich dann in dem Quellcode ändern. Da ist ja jetzt alles auf nen Stringgrid angepasst.

marabu 30. Sep 2007 16:00

Re: Teile von XML auslesen und anzeigen
 
Das ist einfach: Den Code für das Grid entfernen und den Code für das Erzeugen der Label-Komponenten einfügen.

Ich würde die Prozedur ExtractCells() aus meiner Demo anpassen. So kannst du alle Angaben eines Players auf einem Label ausgeben:

Delphi-Quellcode:
procedure ExtractValues(nodes: IXMLNodeList; names: array of string; labels: TObjectList; parent: TWinControl);
var
  RecNode, FldNode: IXMLNode;
  iRec, iFld: Integer;
  s: string;
begin
  labels.Clear;
  for iRec := 0 to Pred(nodes.Count) do
  begin
    RecNode := nodes[iRec];
    s := '';
    for iFld := Low(names) to High(names) do
    begin
      FldNode := RecNode.ChildNodes[names[iFld]];
      s := s + ' ' + VarToStr(FldNode.NodeValue);
    end;
    labels.Add(NewLabel(parent, labels.Count, Trim(s)));
  end;
end;
Vielleicht kannst du ja die Funktion NewLabel() schreiben?

Delphi-Quellcode:
function NewLabel(
    parent: TWinControl;  // ohne Parent keine Anzeige
    index: Integer;       // index ermöglicht calculated layout
    const caption: string // was soll angezeigt werden?
): TLabel;
Getippt und nicht getestet.

XXcD 30. Sep 2007 16:51

Re: Teile von XML auslesen und anzeigen
 
Also so wirklich funktionieren tut es jetzt nicht. Hab jetzt mal die unit Contnrs eingebunden wegen TObjectList. Aber was muss z.b. hier hin:

procedure TDemoForm.ButtonClick(Sender: TObject);
begin
Memo.Text:=GetHTML('http://**********stats.xml');
with XmlDocument do
begin
Active := False;
XML.Assign(Memo.Lines);
try
Active := True;
ExtractValues(documentElement.ChildNodes['sessions'].ChildNodes, >>>>>>>>>Was muss hier rein???<<<<<<<<, FIELDNAMES);
except
on E: Exception do
ShowMessage(E.Message);
end;
end;
end;

marabu 30. Sep 2007 17:45

Re: Teile von XML auslesen und anzeigen
 
Wenn du dir die Signatur der Prozedur ExtractValues() anschaust, dann findest du dort den erwarteten Typ (TObjectList). Du brauchst also ein Object dieser Klasse und da Labels darin verwaltet werden sollen, ist "Labels" auch nicht der schlechteste Bezeichner. Da die Labels für die Anzeige länger leben müssen als eine Prozedur, gehört das Objekt als privates Feld zur Form. Jetzt musst du noch zwei Ereignisse der Form ausfindig machen, bei denen du dieses Objekt sinnvollerweise instanzierst und wieder zerstörst - und schon kannst du es als Parameter beim Aufruf von ExtractValues() verwenden.

XXcD 30. Sep 2007 17:52

Re: Teile von XML auslesen und anzeigen
 
:cry: :cry: :cry: Ich versteh kein Wort. Kannst du mir nicht bitte sagen wie ich das zum laufen kriege??? Also was ich noch für Komponten brauche usw. Biddeeeee

marabu 30. Sep 2007 18:38

Re: Teile von XML auslesen und anzeigen
 
Hallo,

ich fürchte du überschaust die Komplexität noch nicht so ganz: Es ist nicht so, dass du meinen Code einfach nehmen kannst und ein, zwei kleine Änderungen daran machen ein fertiges Programm daraus. Ich kann dir erklären, was ein privates Feld einer Form ist, aber wenn du es selbst nicht weißt, dann fehlen dir sehr viele Grundlagen. Da ist es fraglich, ob du das zu Ende bringst, denn gleich gehe ich ins Bettchen und ab morgen stecke ich wieder für Tage bis zum Hals in meinen Projekten.

Mein Tipp: versuche in deinem Programm nur Konzepte zu verwenden, die du auch schon beherrschst. Wenn du weder mit XML noch mit dynamisch erstellten visuellen Komponenten etwas gemacht hast, dann "teile und herrsche": Schreibe erstmal ein Programm, in welchem du das Anordnen von dynamisch erstellten Labels übst. Dann schreibe ein Programm, welches alle notwendigen Zugriffe auf einen XML DOM enthält. Wenn du die einzelnen Techniken beherrschst, dann kannst du das Gelernte miteinander kombinieren - und am Ende wird ein Programm daraus.

Nimm es mir nicht übel, aber wenn wir beide so weiter machen wie bisher, dann habe ich am Ende dein Programm geschrieben und alles was mir wichtig ist bleibt liegen. Frage, wenn du Verständnisprobleme hast, und ich werde dir antworten, aber dein Programm kann und will ich nicht schreiben.

Freundliche Grüße

ulhau 3. Okt 2007 12:52

Re: Teile von XML auslesen und anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, ich habe das jetzt noch mal ausgegraben.

Also Marabu für mich war deine Schufterei nicht umsonst. Als "XMLIni" geschädigter hat mich dann doch die Neugier gepakt wie das weiter geht. Aber der klize kleine Schritt hat dann doch noch gefehlt ("['sessions'].ChildNodes"). Aber meine Vermutung das bei nicht eindeutiger Bezeichnervergabe immer nur eine Sektion gezielt bearbeitet werden kann ist laut den Tut's von "Celine Hagbard" und "Christopher Harms" richtig gewesen.

Ich habe das Demo jetzt mal beendet.

Nur das mit den Labels ist irgendwie blöd. Man stelle sich mal vor das sich hunderte Label's auf dem Formular tummel. Also das mit dem StringGrid ist schon Optimal da passt 'ne menge rein.

Also Marabu,
Herzlichen Dank für die Lehrstunde und an XXcD, blos nicht aufgeben.

Tschüsss!

XXcD 4. Okt 2007 11:10

Re: Teile von XML auslesen und anzeigen
 
Danke dass du dir die Arbeit gemacht hast ich schau mir die Demo gleich mal an.

ulhau 5. Okt 2007 19:59

Re: Teile von XML auslesen und anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Na da ist wohl doch nicht mehr das Interesse da. Ich hab das jetzt noch mit den Label's gemacht und angehängt. Eine Liesmich.txt ist auch dabei.

Na dann Tschüsss !


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 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