Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi XML mit TJvSimpleXml (https://www.delphipraxis.net/52029-xml-mit-tjvsimplexml.html)

yankee 22. Aug 2005 22:43


XML mit TJvSimpleXml
 
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]

yankee 24. Aug 2005 20:14

Re: XML mit TJvSimpleXml
 
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...

Obi-Wan 26. Aug 2005 13:08

Re: XML mit TJvSimpleXml
 
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 :)

Robert Marquardt 26. Aug 2005 13:38

Re: XML mit TJvSimpleXml
 
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.

duff 10. Sep 2005 16:51

Re: XML mit TJvSimpleXml
 
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]

duff 11. Sep 2005 23:13

Re: XML mit TJvSimpleXml
 
ich nochmal, vielleicht kann mir wirklich jemand helfen, meine xml datei von oben in ein stringgrid zu bekommen!!! bittö

citybreaker 7. Nov 2005 15:27

Re: XML mit TJvSimpleXml
 
Hab da auch mal nen Problem. Unzwar wird mir immer angezeigt, dass
ItenNamed undefiniert ist.

yankee 13. Dez 2005 00:38

Re: XML mit TJvSimpleXml
 
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:

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...

noeon112 21. Mär 2006 11:35

Re: XML mit TJvSimpleXml
 
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

yankee 21. Mär 2006 15:46

Re: XML mit TJvSimpleXml
 
@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...

noeon112 21. Mär 2006 18:13

Re: XML mit TJvSimpleXml
 
Hallo,

also ich versuch es einmal,

Code:
XML_Dock.Root.Name :='Config1';
  with XML_Dock.Root.Items.add('Configtest') do
    Begin
      Items.Add('WERT1',edit1.text);
      Items.Add('cmb_Auswahl',combobox1.ItemIndex);
    end;
      XML_Dock.SaveToFile('Configuration.xml');
Mit dem oben gepostetem Code schreib ich die XML Datei.


Code:
 XML_Dock.LoadFromFile('Configuration.xml');
    xml_Dock.Root.Name := ('config1');
    Edit1.Text := xml_dock.Root.Items.item('Wert1');
    ComboBox1.ItemIndex := xml_Dock.Root.Items.Item('cmb_Auswahl');
Mit dem Code möchte ich die Datei wieder auslesen und zurückschreiben in die entsprechenden Steuerelemente.

Kannst Du helfen?!


Gruss
Lars

yankee 21. Mär 2006 23:57

Re: XML mit TJvSimpleXml
 
Zitat:

Zitat von noeon112
Code:
 XML_Dock.LoadFromFile('Configuration.xml');
    xml_Dock.Root.Name := ('config1');
    Edit1.Text := xml_dock.Root.Items.item('Wert1');
    ComboBox1.ItemIndex := xml_Dock.Root.Items.Item('cmb_Auswahl');

Ja, da lies doch nochmal genauer:
xml_Dock.Root.Name := ('config1'); <-- diese Zeile kannst du dir komplett sparen. Das musst du nur beim Speichern der Datei machen, wenn die vorher nicht existierte. Wieso hast du da eigentlich Klammern um den String?

Edit1.Text := xml_dock.Root.Items.item('Wert1'); <-- Werf mal einen Blick auf die CodeCompletion von Delphi. Diese Funktion erwartet als Parameter einen integer und keinen String. Nebenbei erhaelst du so nur das Element und nicht was in dem Element drin steht. Richtig ist:
Edit1.Text := xml_dock.Root.Items.itemNamed['Wert1'].Value;
Bei der naechsten Zeile genau das selber, nur dass es sich bei Combobox1.itemindex um eine Zahl handelt. Daher nimmst du nicht Value sondern IntValue:
ComboBox1.ItemIndex := xml_Dock.Root.Items.ItemNamed['cmb_Auswahl'].IntValue;

und schon sollte es klappen :-)

noeon112 22. Mär 2006 10:57

Re: XML mit TJvSimpleXml
 
HI,


Also angeschaut ja,
mir war der aufbau nicht ganz klar aber nun klickerte es.

Allerdings gibt es jetzt eine nette kleine Exception

zugriffsverletzung am Modul Projekt1.exe
Die Datei ist allerdings geschlossen...


Hast Du noch einen Tipp wie ich das händeln kann!?
Code:
Edit1.Text := xml_dock.Root.Items.itemNamed['Wert1'].Value;
in dieser zeile springt er raus und macht sie blau...


Gruss
lars

und zur Vollständigkeit halber einmal die XML Datei

XML-Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<Config1>
  <Configtest>
    <WERT1>Testwert</WERT1>
    <cmb_Auswahl>2</cmb_Auswahl>
  </Configtest>
</Config1>

yankee 22. Mär 2006 14:00

Re: XML mit TJvSimpleXml
 
Zitat:

Zitat von noeon112
Code:
Edit1.Text := xml_dock.Root.Items.itemNamed['Wert1'].Value;
in dieser zeile springt er raus und macht sie blau...

Ja, das passt immernoch nicht so ganz zu deiner xml-Datei
<?xml version="1.0" encoding="iso-8859-1"?>
<Config1> --root-Element
<Configtest> --Unterelement des rootelements mit dem Name configtest
<WERT1>Testwert</WERT1> --unterelement des Configtestelements mit dem Name WERT1
<cmb_Auswahl>2</cmb_Auswahl>
</Configtest>
</Config1>

Das Unterelement des rootelements mit dem Name configtest leasst du komplett weg.
Richtig:
Delphi-Quellcode:
Edit1.Text := xml_dock.Root.Items.itemNamed['Configtest'].items.itemNamed['Wert1'].Value;
Wenn das immernochnicht funzt, dann solltest du mal versuchen die gross- und kleinschreibung abgleichen. Also entweder beim speichern und beim Laden gross schreiben oder beides klein...

noeon112 30. Mär 2006 10:37

Re: XML mit TJvSimpleXml
 
Hallo,

So nun mal Sinning,

Ich hab ein kleines Problem selber gelöst,
die XML Datei die ich mir erzeugt habe von unten nach oben auszulesen. *froi*

Jetzt will ich bestimmte Einträge suchen, also eine Art Indizierung darstellen.

Variante 1: StringList alle werte einlesen und mit Index Versehen.
variante 2: in einer Schleife die Werte der XML Datei durchlaufen lassen.

Es geht darum keine doppelten Werte vorkommen zu lassen.



Danch will ich auch noch entspreche Werte wieder löschen.

Ich bion ja mal gespannt. Ist ein echt spannendes Thema.


Wenn es ok ist stelle ich das Projekt mal rein und vielleicht kann man da ja auch was mitnehmen an Erfahrung.

Gruß
Lars

XML-Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<Config1>
  <Configtest>
    <ProfilName>Profil 1</ProfilName>
    <WERT1>Hallo Versuch 1</WERT1>
    <cmb_Auswahl>2</cmb_Auswahl>
  </Configtest>
  <Configtest>
    <ProfilName>Profil 2</ProfilName>
    <WERT1>Hallo Versuch 2</WERT1>
    <cmb_Auswahl>3</cmb_Auswahl>
  </Configtest>
</Config1>

mav 12. Jun 2006 18:13

Re: XML mit TJvSimpleXml
 
hi all..

bin gerade an einem kleinen xml projekt.. und suchte nach guten möglichkeiten ein xml-file auszulesen. da sties ich auf dieses tut hier.
jetzt zu meinem problem:
Delphi meldet mir dass er aus "XmlDoc.Root.Count"

[Fehler] profiler_readout.pas(40): Undefinierter Bezeichner: 'Count'

kann mir dabei jemand helfen?

Jarmen_Kell 12. Jun 2006 18:46

Re: XML mit TJvSimpleXml
 
Das kann durchaus jemand^^

Nun, Es gibt nur einen root, daher hat root keine Eigenschaft "Count".
Root hat aber Items, die gezählt und ausgegeben werden können.
Demnach muss es also einfach nur .Root.Items.Count heißen!

alias5000 12. Jun 2006 19:14

Re: XML mit TJvSimpleXml
 
Erstmal ein großes dankeschön für das Tut. Sowas in der Art hab ich irgendwie schon immer gesucht. Allerdings bin ich der Meinung, dass mit dem TJvSimpleXML auch sowas
Code:
<resource_name value="VV4A"/>
möglich ist (*nachdenk*). Ich hab mit dem SImpleXML ja schonmal rumgespielt. Sollte ihc da was rausfinden, melde ich mich.

Ich hab aber eine andere Frage:
wie sieht das mit der Geschwindigkeit aus, wenn ich, sagen wir mal zu einer geladenen XML Datei so 3-4 Unterknoten einfüge (mit jeweils etwa einer Zeile Text als Inhalt) und das dann abspeichere. Ist da die JVCL Variante schnell, oder gibts da noch was besseres? Die Frage ist jetzt so eine Sache, weil ich das auch selbst testen könnte. Falls jemand so schon Ahnung hat, würde ich sie gerne hören, ansonsten werd ich selbst testen (müssen).

Gruß alias5000

Jarmen_Kell 13. Jun 2006 13:37

Re: XML mit TJvSimpleXml
 
Ich meine, hier mal irgendwo gelesen zu haben, dass die TJvSimpleXML keine Attribute behandeln kann. Dort wurde darauf verwiesen, dass es ja nur eine Simple-XML ist und man das daher nicht erwarten könne...
Aber interessant wäre das für mich durchaus auch einmal, wenn auch ich damit schon einiges tat und noch auf keine Möglichkeit stieß.

Bezüglich Zeitaufwand: Genaue Werte kann ich dir auch nicht geben, doch geht es wirklich raschefix^^
Ich habe eine Datei mit ~20 Unterknoten, die jeweils 7 Elemente enthalten.. Von der Speicherung merke ich dabei nichts und auch das einfügen (wenn auch sie einzeln eingefügt und vorher händisch eingegeben werden) geht ohne merklichen Verbrauch von statten.
Bei den 4 Einträgen sollte die Zeit also absolut irrelevant sein.

alias5000 13. Jun 2006 20:53

Re: XML mit TJvSimpleXml
 
Bloß, wenn ich schon, sagen wir mal 400 Knoten mit je den 4 Unterknoten hab, wie siehts dann aus
(Es geht um die gestaltung einer Historie in einem Chat, da muss das schnell von statten gehen)

yankee 13. Jun 2006 21:10

Re: XML mit TJvSimpleXml
 
Also die JVCL-Lösung ist im Vergleich der meisten anderen Parser sehr schnell.
Das hängt aber damit zusammen, dass die Funktionalität auch sehr eingeschränkt ist... Andere xml-parser prüfen erstmal, ob das Dokument korrekt formatier ist, die richtigen Werte enthält mit richtigem Datentyp und die Baumstruktur richtig ist...
Allerdings sind die meisten dieser Prüfungen bei den meisten Anwendungsfällen meiner Meinung nach eh überflüssig....

alias5000 13. Jun 2006 21:20

Re: XML mit TJvSimpleXml
 
Wenn ich die XML-Datei eh mit JvSimpleXNL erstelle auf jeden Fall.

DGL-luke 14. Jun 2006 13:02

Re: XML mit TJvSimpleXml
 
Hallo, ich bin gerade dabei, ein OO.o Spreadsheet zu verhackstücken. :mrgreen:

Ich hätte gerne auf die Text-nodes zugriff, die in der hierarchie ungefähr so liegen:

XML-Code:
- <office:body>
- <office:spreadsheet>
- <table:table table:name="Tabelle1" table:style-name="ta1" table:print="false">
  <office:forms form:automatic-focus="false" form:apply-design-mode="false" />
  <table:table-column table:style-name="co1" table:default-cell-style-name="Default" />
- <table:table-row table:style-name="ro1">
- <table:table-cell office:value-type="string">
  <text:p>A</text:p>
Muss ich mich da komplett durchhangeln, oder kann ich das jvsimplexml auch suchen lassen nach "text:p"-elementen?

SteffenSchm 1. Aug 2006 12:21

Re: XML mit TJvSimpleXml
 
@Yankee:
Danke für das Tutorial. Hat mir sehr wweitergeholfen!

Ein Frage - du schreibst
Zitat:

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.
Ich habe aber keine überladene Version von Add gefunden, die einen Float-Wert ausgibt. Man könnte natürlich selbst immer in einen String hin- und zurückkonvertieren. Aber bestimmt gibt es eine bessere Möglichkeit. Wie macht man das am besten?

yankee 3. Okt 2006 19:54

Re: XML mit TJvSimpleXml
 
Zitat:

Zitat von SteffenSchm
Ich habe aber keine überladene Version von Add gefunden, die einen Float-Wert ausgibt. Man könnte natürlich selbst immer in einen String hin- und zurückkonvertieren. Aber bestimmt gibt es eine bessere Möglichkeit. Wie macht man das am besten?

Erstmal sry, dass ich erst jetzt antworte...
Ich bekomme auf diesen Thread von der DP nie eine Benachrichtigungsmail und das war jetzt gerade reiner Zufall, das ich Antworten gefunden habe :-(.

Ich glaube nicht, dass es eine bessere Möglichkeit gibt. jvcl kann schliesslich am Ende auch nichts anderes machen als mit strtofloat die Daten zu konvertieren. Es geht höchstesn eleganter, aber nicht performanter oder irgendsowas.

@DGL-luke:
Eine Suchfunktion wäre mir neu. Du musst dir also selbst eine Suchroutine schreiben.
Wie gesagt es ist eine simplexml-Komponente, die entsprechend einfach ist.
Um solch komplexe Sachen zu parsen ist eventuell ein komplexerer Parser emphelenswerter...

elundril 23. Jun 2007 17:55

Re: XML mit TJvSimpleXml
 
hallo! ich fand dein tutorial recht gut nur eine anmerkung hab ich!

wenn man am formular dieses Ding hat und man speichert die XML datei und will nachher noch einmal speicher sollte man die vorher gespeicherten daten mit

XMLDoc.Data:=''

verwerfen sonst wird alles doppelt geschrieben!

dabei hab ich auch gleich ein bitte: vielleicht kannst du mir bei dem Problem weiterhelfen:

http://www.delphi-forum.de/viewtopic...958&highlight=



lg elundril

WizoHulk 3. Mai 2011 20:28

AW: XML mit TJvSimpleXml
 
hallo..

auch wenn der Thread ja doch ziemlich alt ist vileicht bekommt man ja doch noch eine Antwort.

Wie kann ich in einen vorhandenen Root einen Wert eingeben.
Da die Funktion Add nur hinzufügt.

ConnorMcLeod 4. Mai 2011 10:32

AW: XML mit TJvSimpleXml
 
Ungefähr so?
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  lXML      : TJvSimpleXML;
begin
  lXML := TJvSimpleXML.Create(nil);
  try
    lXML.Root.Name := 'myroot';
    lXML.Root.Value := 'blah';
  finally
    FreeAndNil(lXML);
  end;
end;

WizoHulk 5. Mai 2011 17:17

AW: XML mit TJvSimpleXml
 
ich glaub ich habe mich etwas falsch ausgedrückt.

ich habe einen Knoten unter Root und in diesen Knoten möchte ich einen Wert zuweisen.

haentschman 5. Mai 2011 18:11

AW: XML mit TJvSimpleXml
 
Hallo...

die "Unterknoten" erreichst du über Items bzw Item jeweils über den Index z.B. ItemNamed gibt es auch noch...

ConnorMcLeod 5. Mai 2011 18:18

AW: XML mit TJvSimpleXml
 
Da gibt's gerade einen parallelen Thread ;-)

Dem Rootknoten einen Knoten hinzufügen:
Delphi-Quellcode:
with XML.Root.Items.Add('NameDesNeuenKnotens') do
begin
  Value := 'blah';
end;

WizoHulk 5. Mai 2011 18:43

AW: XML mit TJvSimpleXml
 
Jaaawoll Danke.

Hier für die Nachwelt:

Delphi-Quellcode:
JvSimpleXML1.Root.Items.ItemNamed['Share'].Items.Add('Pfad');

WizoHulk 13. Mai 2011 20:03

AW: XML mit TJvSimpleXml
 
Hallo,
ich füge mittelss diesem Code Werte ein.

Delphi-Quellcode:
 Xml.Root.Items.ItemNamed['Share'].Items.Add('<Directory Virtual="WizoHulk">C:\Users\WizoHulk\</Directory>');
nach ddem abspeichern der xml sieht der Eintrag so aus
Code:
<&lt;Directory Virtual=&quot;WizoHulk&quot;&gt;C:\Users\WizoHulk\&lt;/Directory&gt;/>
wie kann ich dieses Problem beheben damit es dann in der XML so aussieht
Code:
'<Directory Virtual="Name">C:\Users\WizoHulk\</Directory>'

himitsu 13. Mai 2011 20:32

AW: XML mit TJvSimpleXml
 
Das < > und & zählen zu den Steuerzeichen.
Du fügst diese mit Add als Text ein und demnach werden sie natürlich "ordnungsgemäß" maskiert/kodiert.

Füge einen Node "Directory" hinzu, in diesem Node trägst du deinen Pfad als Text ein und nicht das Attribut "Virtual" mit dem Text "WizoHulk" vergessen.

WizoHulk 14. Mai 2011 21:07

AW: XML mit TJvSimpleXml
 
ich versteh gerade nur bahnhof.

also ich soll unter Share einen neuen knoten hinzufügen.
Code:
Directory
?!
aber was mache ich mit dem Virtual?

ich glaub ich stehe grad aufn schlauch

WizoHulk 14. Mai 2011 21:51

AW: XML mit TJvSimpleXml
 
wenn ich einen neuen Knoten erstellen mit den Namen Directory dann habe ich ja am Anfang und am ende den Namen.
Aber bei meinem Fall ist das ja so, das der Knotenname
Code:
<Directory Virtual =
ist und am ende
Code:
</Directory>
.

Code:
<Share>
  <Directory Virtual="Name">Pfad</Directory>
  <Directory Virtual="eigeneDateien">C:\eigeneDateien</Directory>
  <Directory Virtual="WizoHulk">C:\Users\WizoHulk\</Directory>
</Share>

Sir Rufo 14. Mai 2011 22:19

AW: XML mit TJvSimpleXml
 
Falsch, der Knoten hat als Namen
Code:
Directory
und dieser Knoten hat noch ein Attribut
Code:
Virtual
mit dem Wert
Code:
Name
.
Der Inhalt des Knotens ist dann
Code:
Pfad
XML Logischer Aufbau

WizoHulk 14. Mai 2011 23:33

AW: XML mit TJvSimpleXml
 
kann es sein das es keine Function gibt die eine Attribut setzt?

Sir Rufo 15. Mai 2011 00:05

AW: XML mit TJvSimpleXml
 
Such mal hier im Forum nach himXML damit geht das auf jeden Fall

himitsu 15. Mai 2011 00:37

AW: XML mit TJvSimpleXml
 
Nein, kann es nicht.
Ich hab jetzt die JEDI-XML-Lib nicht vor mir liegen, aber ich bin mir ganz sicher, daß es dafür was gibt und da ist mit großer Sicherheit auch etwas ala "Attr", "Attrib" oder sogar "Attribute" im Namen der Methode/Property.

Zitat:

Zitat von Sir Rufo (Beitrag 1100851)
Falsch, der Knoten hat als Namen
Delphi-Quellcode:
Directory
und dieser Knoten hat noch ein Attribut
Delphi-Quellcode:
Virtual
mit dem Wert
Delphi-Quellcode:
Name
.
Der Inhalt des Knotens ist dann
Delphi-Quellcode:
Pfad
.
XML Logischer Aufbau

Wobei sowas ja auch schonmal gesagt wurde ... ich frag mich nur von wem? :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz