AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi XML mit TJvSimpleXml
Tutorial durchsuchen
Ansicht
Themen-Optionen

XML mit TJvSimpleXml

Ein Tutorial von yankee · begonnen am 22. Aug 2005 · letzter Beitrag vom 17. Mai 2015
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Benutzerbild von yankee
yankee
Registriert seit: 10. Mär 2004
Immernoch sehe ich, wie sich Leute mit Ini usw. rumschlagen. Das war bis vor ein paar Wochen bei mir genauso, weil ich nie mal ein tutorial hatte, was mir den Umgang mit xml erklärt hat. Ich habe dann irgendwo mal was von dieser JvSimpleXml gelesen und die mir dann mal auf's Form geschmissen und dann einfach mla die ganzen Optionen durchgescrollt und mal ein bißchen ausprobiert... So wahnsinnig weit bin ich noch incht gekommen, aber trotzdem kann ich damit jetzt grundsätzlich xml benutzen .
Damit euch das incht gejnauso geht möchte ich hiermit kurz den Einstieg in die XML-Welt mit der Komponente TJvSimpleXML (jvcl.sourceforge.net) geben...

1. Das XML-Format
Zunächst müssen wir uns mal den Aufbau einer XML-Datei ansehen. Ich zeige das mal am Beispiel eines Adressbuches:
XML-Code:
<?xml version="1.0" ?>
<Adressen>
</Adressen>
Das ist eigentlich schon eine Vollwertige XML-Datei. Enthält nur leider noch überhaupt keine Daten.
Um jetzt Daten in die Datei zu bekommen kann 'Adressen' eine belibege Anzahl Unterelmente haben. Beispielsweise wollen wir jetzt mal 2 Namen in der XML-Datei speichern. Das sieht dann so aus:
XML-Code:
<?xml version="1.0" ?>
<Adressen>
  <Name>Manfred</Name>
  <Name>Thomas</Name>
</Adressen>
Das ista schon alles. So könnten wir jetzt theoretisch beliebig viele Namen speichern. Jetzt wollen wir aber auch noch Manfreds und Thomas Telefonnummer speichern. Wie machen wir das?
Hierfür muss man wissen, das Name auch wieder unterelemente haben kann. Besser noch ist es sich einen neuen tag auszudenken. Nehmen wir mal Adresse:
XML-Code:
<?xml version="1.0" ?>
<Adressen>
  <Adresse>
    <Name>Manfred</Name>
    <Telefon>0675 35689</Telefon>
  </Adresse>
  <Adresse>
    <Name>Thomas</Name>
    <Telefon>0625 3562459</Telefon>
  </Adresse>
</Adressen>
Das sieht doch schonmal gut aus.
2. XML mit JVCL (reim sich *freu*)
Jetzt wollen wir das mal mit TJvSimpleXml umsetzen. Experimentel starten wir Delphi, legen die Komponente auf das Form und noch einen Button mit der Aufschrift "speichern". In die Procedure dieses buttons schreiben wir vollkommen simpel (ich gehe mal davon aus, dass ihr die Komponente XmlDoc genannt habt):
XmlDoc.SaveToFile('Adressen.xml');
Ihr könnt natürlich auch einen anderen Pfad, oder die Datei anders nennen, aber ich werde sie hier Adressen.xml nennen.
Dann fügt ihr noch einen Button 'laden' hinzu und schrieb entsprechend
XmlDoc.LoadFromFile('Adressen.xml');
in die procedure. Jetzt Starten wir das ganze und klicken mal auf speichern. Dann sehen wir uns in einem Texteditor mla an, was die Komponente uns da erstellt hat. Da sollten wir so etwas sehen:
XML-Code:
<?xml version="1.0" ?>
< />
Also ziemlich wenig. Und wenn ihr probiert die Datei beispielsweise mit dem Internet Explorer zu öffnen, werdet ihr einen Fehler erhalten. Was haben wir also falsch gemacht? Nun, ziemlich einfach: Der root-Tag (das was in meinen Beispiel Adressen ist), ist ein leerer String! Also werden wir dem mal einen zuweisen. Schreibt einfach in das OnCreate vom Form:
XmlDoc.Root.Name :='Adressen';
Und dann nochmal speichern und die entstandene Datei im Texteditor betrachten:
XML-Code:
<?xml version="1.0" ?>
<Adressen />
Na super. Warum ist das denn nicht so, wie der yankee das in seinem Beispiel ganz am Anfang geschriben hat? Da sollte doch <Adressen></Adressen> stehen! Antwort: Wenn ein Tag leer ist, dann kann man ihn so abkürzen, in dem man einfach den / noch in den starttag mitreinschreibt.
Aber gut, jetzt wollen wir ndlich Daten in unsere xml-datei haben. Positionieren wir also auch noch ein edit und einen weiteren button (caption:'Hinzufügen') auf unserem Form. In die Hinzufügenprocedure schreiben wir folgendes:
XmlDoc.Root.Items.Add('name',edit1.text);
kurze erklärung zu diesem Befehl:
root, ist wie bereits gesagt der oberste Tag. Heißt bei uns Adressen. Dieser Tag hat Unterpunkte. Und zu diesen Unterpunkten fügen wir jetzt einen hinzu. Der Punkt heißt 'name' und zugehörig ist der Wert, der im edit steht. Wenn man bei dem Add-Befehl die Klammer öffnet, kommt einem diekt die DelphiIDE zur Hilfe und sagt einem, welche Werte man dieser function übergeben kann. Und sofort fällt auf, dass diese function gleich ganz häufig überladen ist. Man kann so auch gleich float oder integerwerte übergeben.
Nun aber zur Tat. Wir starten unser Programm, geben Manfred ein und klicken auf Hinzufügen. Dann geben wir noch Thomas ein und klicken wieder auf hinzufügen. Dann klicken wir wieder auf speichern und sehen uns die Datei in einem Texteditor an. Und?? Was ist wohl rausgekommen? Na ednlich mla was vernünftiges. Ihr solltet jetzt das gleiche vor euch haben, wie oben mein erstes Beispiel mit Daten:
XML-Code:
<?xml version="1.0" ?>
<Adressen>
  <Name>Manfred</Name>
  <Name>Thomas</Name>
</Adressen>
Super, jetzt wollen wir nur noch in der Lage sein so tolle Unterpunkte einzurichten, wie der yankee es in seinem ersten Besipiel gemacht hat.
Ok, wir positionieren auch noch ein zweites edit (für die Telefonnummer) auf unserem Form. Und dann ändern wir den Befehl im Hinzufügenbutton nochmal:
Delphi-Quellcode:
with XmlDoc.Root.Items.Add('Adresse') do
begin
  items.Add('Name',edit1.text);
  items.Add('Telefon',edit2.text);
end;
ja, das ist schon mehr code geworden und bei mehr als 1 Zeile lohnt es sich dann schon Delhi-tags zu setzen .
Also, was machen wir hier? Die add-Function gibt uns, wie es beispielsweise auch bei normalen Menüs ist einen Pointer auf das gerade erstellte Element zurück. Dieses Element ist wieder das gleiche, wie das root-Element und enthält wieder items, denen man was hinzufügen kann usw. Das könnte man jetzt natürlich auch in die Tiefe führen und zehnmal Add-kommandos hintereinader ausführen, was allerdings nur begrentzt sinnvoll ist.
Nun, ihr könnt euch ja denken, was jett kommt: starten, werte eingeben, hinzufügen, speichern, beenden, texteditor, oh, das ist ja das gleiche Schema, ei in yankees Beispiel oben

So, ich hoffe ich habe nicht allzuviele Fehler eingebaut (weil ich nämlcih gerade an einem Computer ohne Delphi bin und es nicht testen kann). Wann da was ist, könnt ihr euch ja beschweren.

Morgen gibt es dann noch eine Anleitung, wie man die Daten wieder ausliest. Also freut euch schonmal auf Teil 2!

[edit=Matze] Mfg, Matze[/edit]
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
 
Benutzerbild von yankee
yankee

 
Lazarus
 
#2
  Alt 24. Aug 2005, 21:14
So, etwas verspätet kommt der zweite wesentlich kürzere Teil. Irgendwie war ich einfach so müde, dass ich da nichgtmehr geschafft habe...

Also, geben wir unser Adressbuch am besten einfach in einem StringGrid aus. Also positionieren wir ein StringGrid auf unserem Formular. Unser StringGrid bekommt 2 Spalten: Für Name und Telefonnummer. Dann erweitern wir den Code unter "laden":
Delphi-Quellcode:
XmlDoc.LoadFromFile('Adressen.xml');
//Überschriften
StringGrid1.RowCount :=XmlDoc.Root.Count +1;
StringGrid1.cells[0,0] :='Name';
StringGrid1.cells[1,0] :='Telefon';

//Daten:
for i:=0 to XmlDoc.Root.Count -1 do
begin
    StringGrid1.cells[0,i+1] :=XmlDoc.Root.Items.Item[i].ItemNamed['Name'].Value;
    StringGrid1.cells[1,i+1] :=XmlDoc.Root.Items.Item[i].ItemNamed['Telefon'].Value;
end;
So, was machen wir da? Der Überschriftenteil muss wohl nicht erklären werden....
Dann gehen wir einfach alle Unterelement von Root durch und nehmen und dass jeweils das Item mit dem passendem Namen raus und dann deren Wert. Übrigens kann man nicht nur Value nehmen, sonder beispielsweise auch IntValue und so direkt den Wert im Richtigen Typ abfragen.
Simpel, ne?

So, jetzt wäre es noch schön, wenn cih ein bißchen Feedback bekäme...
  Mit Zitat antworten Zitat
Benutzerbild von Obi-Wan
Obi-Wan

 
Delphi 2005 Personal
 
#3
  Alt 26. Aug 2005, 14:08
Danke, hat mir sehr weitergeholfen da ich gerade beim XML lernen bin. Ist eigentlich ziemlich einfach. Also ich werde nie wieder so ein .ini gewurschtel machen. XML rockt!
Also noch einmal danke für dieses Einsteigertut
  Mit Zitat antworten Zitat
Robert Marquardt
 
#4
  Alt 26. Aug 2005, 14:38
Diese Simpel-XML ist noch einfach, auch wenn diese kontextfreie Struktur ohne Attribute an den Tags auch schon zu kompliziert ist fuer einige Programmierer.
Ein Schema macht sdie Sache dann richtig kompliziert (besonders bei der Pruefung ob das Dokument zum Schema passt).
Das Schema beschreibt welche Tags innerhalb welcher anderen Tags auftauchen duerfen und wieviele davon. Entsprechendes auch fuer die Attribute.
Man kann also bestimmen das <Name> nur innerhalb von <Adresse> erlaubt ist und nur genau einmal oder maximal einmal vorkommen darf.
Auf der Ebene der formalen Grammatik ist es ohne Schema kontextfrei und mit Schema kontextsensitiv.
  Mit Zitat antworten Zitat
Benutzerbild von duff
duff

 
Delphi 2007 Professional
 
#5
  Alt 10. Sep 2005, 17:51
schönes tutorial... jetzt würde es mich aber noch interessieren, wie ich es schaffe eine xml datei mit simplexml einzulesen, die so aufgebaut ist

XML-Code:
<handelskurse>
-
   <kurse>
-
<resource value="1">
<resource_name value="Eisen"/>
<preis_ankauf value="0.23"/>
<preis_verkauf value="0.43"/>
<handel_aktiv value="1"/>
</resource>
-
<resource value="2">
<resource_name value="Stahl"/>
<preis_ankauf value="1.64"/>
<preis_verkauf value="1.84"/>
<handel_aktiv value="1"/>
</resource>
-
<resource value="3">
<resource_name value="VV4A"/>
<preis_ankauf value="6.5"/>
<preis_verkauf value="6.7"/>
<handel_aktiv value="1"/>
</resource>
-
<resource value="4">
<resource_name value="Eis"/>
<preis_ankauf value="0.72"/>
<preis_verkauf value="0.92"/>
<handel_aktiv value="1"/>
</resource>
-
<resource value="5">
<resource_name value="chem. Elemente"/>
<preis_ankauf value="0.71"/>
<preis_verkauf value="0.91"/>
<handel_aktiv value="1"/>
</resource>
-
<resource value="6">
<resource_name value="Wasser"/>
<preis_ankauf value="1.63"/>
<preis_verkauf value="2.03"/>
<handel_aktiv value="1"/>
</resource>
-
<resource value="7">
<resource_name value="Energie"/>
<preis_ankauf value="0.17"/>
<preis_verkauf value="2.15"/>
<handel_aktiv value="1"/>
</resource>
-
<resource value="8">
<resource_name value="Pinguine"/>
<preis_ankauf value="0"/>
<preis_verkauf value="0"/>
<handel_aktiv value="0"/>
</resource>
</kurse>
-
<data>
<gebuehr_prozent value="4.00"/>
<gebuehr_einmalig value="100"/>
<menge_minimum value="100"/>
</data>
-
<informationen>
<aktualisierungszeit value="1126366210"/>
</informationen>
</handelskurse>
oder halt so anzulegen, gibst da noch´n tipp von euch???

[edit=Matze] Mfg, Matze[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von duff
duff

 
Delphi 2007 Professional
 
#6
  Alt 12. Sep 2005, 00:13
ich nochmal, vielleicht kann mir wirklich jemand helfen, meine xml datei von oben in ein stringgrid zu bekommen!!! bittö
  Mit Zitat antworten Zitat
citybreaker
 
#7
  Alt 7. Nov 2005, 16:27
Hab da auch mal nen Problem. Unzwar wird mir immer angezeigt, dass
ItenNamed undefiniert ist.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#8
  Alt 13. Dez 2005, 01:38
Sry, aus irgendeinem mir unbekannten Grund habe ich keine Benachrichtigunsgmail erhalten, dass es einen neuen Beitrag in dem Thread hier gibt und ich she das heir rein zufällig.
Zitat von citybreaker:
Hab da auch mal nen Problem. Unzwar wird mir immer angezeigt, dass
ItenNamed undefiniert ist.
Es sollte ItemNamed sein. War das nur ein Tippfehler hier? Falls das Prob noch aktuell ist, schrib mir nochmal.

@duff: Sry... ABer SimpleXML heißt simple, weil es eben nur dieses einfache Format kann (glaube ich zumindest). Für den Fall, dass du das Problem immernoch hast, schreib' nochmal, dann kann ich dir vielleicht eine andere Möglkichkeit schreiben...
  Mit Zitat antworten Zitat
noeon112
 
#9
  Alt 21. Mär 2006, 12:35
Hallo,

nochmal eine Frage,
wenn das jetzt als ini File Ersatz gilt muss ich das auch wieder auslesen könne.
Das heisst onCreate will ich, dass diese Datei die ich erzeugt und mit Wertemn gefüllt habe die entsprechenden felder befüllt.


Ich hab 2 Felder ein Edit1 und eine Combobox


Wie bekomme ich das jetzt zurück aus der Datei?!

Das Beispiel aus dem Tut läuft nicht. Oder ich bin zu blöd.

ich hab die gleiche Strucktur wie aus der TUT xml Datei.


Whh can help!`

Gruss Lars
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#10
  Alt 21. Mär 2006, 16:46
@noeon112:
Das faellt mir jetzt ein wenig schwer nachzuvollziehen, wo dein Problem ist. Wenn du wirklich die gleiche xml-Struktur wie in meinem Beispiel hast, dann wuerdest du so:
XmlDoc.Root.Items.Item[i].ItemNamed['Name'].Value;
an den Wert im Element Name erhalten, das ein Unterelement vom iten Unterelement vom root-Element ist.

Poste doch einfach mal deinen Code und einen Ausschnitt aus deiner xml-Datei...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 16:26 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