![]() |
Delphi-Version: 5
Wert in XML finden?
Hallo zusammen,
bin neu hier und habe gleich diese Frage: also ich habe viele XML-Dateien dieser Art. Gesucht soll nach der Anrede "Dr.", was natürlich an unterschiedlichen Stellen sich befinden kann, oder gar fehlen kann. Ist diese Gefunden - soll sein Alter ausgelesen werden, und das Auslesen des Alters gelingt mir nicht. Könnte mir da jemand auf die Sprünge helfen?
Code:
<PDB>
<Header> <Daten> <Personen> <Anrede>Herr</Anrede> <Vorname>Otto</Vorname> <Nachname>Müller</Nachname> <Alter>45</Alter> </Personen> <Personen> <Anrede>Frau</Anrede> <Vorname>Atta</Vorname> <Nachname>Schmidt</Nachname> <Alter>56</Alter> </Personen> <Personen> <Anrede>Dr.</Anrede> <Vorname>Michael</Vorname> <Nachname>Meier</Nachname> <Alter>55</Alter> </Personen> <Personen> <Anrede>Herr</Anrede> <Vorname>Gerd</Vorname> <Nachname>Schulz</Nachname> <Alter>33</Alter> </Personen> </Daten> </Header> </PDB>
Delphi-Quellcode:
Vielen herzlichen Dank!
ReadXMLFile(Doc, 'test.XML');
NList := Doc.GetElementsByTagName('Anrede'); if Assigned(NList) then begin for i := 0 to NList.Count - 1 do begin if NList.Item[i].TextContent = 'Dr.' then begin // wie hier das Alter von "Dr. Meier" auslesen? end; end; end; |
AW: Wert in XML finden?
.. wieso iterierst Du nicht durch den Tag <Personen> und fragst dann die <Anrede> ab. Ist die Anrede Dr. dann kannst Du auch noch das Alter abfragen.
Grüsse Klaus |
AW: Wert in XML finden?
Zitat:
|
AW: Wert in XML finden?
.. Du itterierst über den Tag <Anrede>
Delphi-Quellcode:
Die NList beinhalten alle Node mit dem Tag <Personen>.
ReadXMLFile(Doc, 'test.XML');
NList := Doc.GetElementsByTagName('Personen'); if Assigned(NList) then begin for i := 0 to NList.Count - 1 do begin if NList.Item[i].FindNode('Anrede').TextContent = 'Dr.' then begin NList.Items[i].FindNode('Alter').TextContent; end; end; end; In dem Node kannst Du dann Anrede und Alter abfragen. Ich kenne leider nicht Deine xml Bibliothek - kann Dir daher nicht exakt sagen wie das geht. Gibts da nicht sowas wie getNodeByName('Anrede') o.ä? Grüße Klaus |
AW: Wert in XML finden?
Hallo Klaus,
danke Dir! Ich schaue mal nach! |
AW: Wert in XML finden?
Deine Aufgabenstellung scheint nicht klar. Du schreibst oben, dass du nach Dr. suchst und dann das Alter auslesen möchtest. Daraus deute ich, das, wenn du keinen Dr. findest, das Alter nicht interessant ist. Bei Klaus wird doch nach Dr. gesucht und erst wenn dieser gefunden wurde, dann wurde das Alter ermittelt.
Nach was willst du nun suchen? |
AW: Wert in XML finden?
Hallo zusammen,
@zeras Du hast Recht. XML ist noch ein Neuland für mich, daher stand ich auf dem Schlauch. @Klaus01 Danke Dir, so läuft das also. :thumb: Die weitere Aufgabenstellung ist, wenn sich in der XML ein Dr. befindet und er über 50 Jahre alt ist, dann werden ihm zwei Praktikanten zugewiesen und dessen Namen in die XML geschrieben. Jetzt muss ich praktisch in die bestehende XML-Datei folgendes reinschreiben:
Code:
Und da habe ich erstmal keine Ansätze. Kann ich die oben genannten Datensätze einfach in die XML-Datei hineinschreiben, oder muss ich die komplette Datei einlesen, und modifiziert neu schreiben?
<Personen>
<Anrede>Herr</Anrede> <Vorname>Emil</Vorname> <Nachname>Schmidt</Nachname> <Alter>19</Alter> </Personen> <Personen> <Anrede>Frau</Anrede> <Vorname>Ute</Vorname> <Nachname>Boden</Nachname> <Alter>20</Alter> </Personen> |
AW: Wert in XML finden?
.. ich denke kannst Du schon da hineinschreiben - nur
Wie willst Du die Bezüge zum Dr. zu den Praktikanten hineinbringen? Da fehlt meiner Meinung nach ein Tag bei den Praktikaten - der darauf hindeutet wer für ihn/sie zuständig/verantwortlich ist. Grüße Klaus |
AW: Wert in XML finden?
Zitat:
|
AW: Wert in XML finden?
.. nun da ich Deine XML Library nicht kenne..
Im Prinzip so: Du erstellst Dir einen neuen Knoten <Personen> diese fügst Du weiter Unterknoten hinzu. Den <Personen>-Knoten kannst Du dann dem Knoten <Daten> hinzufügen. Grüße Klaus |
AW: Wert in XML finden?
Zitat:
Delphi-Quellcode:
Doc := TXMLDocument.Create;
RootNode := Doc.CreateElement('Personen'); Doc.Appendchild(RootNode); RootNode:= Doc.DocumentElement; ParentNode := Doc.CreateElement('Anrede'); VarElemen := Doc.CreateTextNode('Herr'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); ParentNode := Doc.CreateElement('Vorname'); VarElemen := Doc.CreateTextNode('Michael'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); ParentNode := Doc.CreateElement('Nachname'); VarElemen := Doc.CreateTextNode('Lücker'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); ParentNode := Doc.CreateElement('Alter'); VarElemen := Doc.CreateTextNode('19'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); WriteXMLFile(Doc, 'file.xml'); |
AW: Wert in XML finden?
Habe noch das hier gefunden:
Delphi-Quellcode:
Die Frage ist nur, an welche Stelle (Item[Posicao]) setze ich meinen <Personen>-Knoten ein?
NovoNo := XMLDoc.CreateElement('item');
TDOMElement(NovoNo).SetAttribute('nome', 'Item'); TDOMElement(NovoNo).SetAttribute('arquivo', 'Arquivo'); XMLDoc.DocumentElement.ChildNodes.Item[Posicao].AppendChild(NovoNo); |
AW: Wert in XML finden?
vielleicht so:
Delphi-Quellcode:
Grüße
DatenNode := Doc.DocumentElement.FindNode('Daten');
DatenNode.AppendChild(<neuer PersonenKnoten>); Klaus |
AW: Wert in XML finden?
Ok... müsste also so gehen, aber irgendwie mache ich noch was falsch, und ich verstehe nicht was.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var Doc: TXMLDocument; RootNode, ParentNode, DatenNode, VarElemen: TDOMNode; begin try ReadXMLFile(Doc, 'Muster.xml'); //Doc := TXMLDocument.Create; RootNode := Doc.CreateElement('Personen'); Doc.Appendchild(RootNode); RootNode:= Doc.DocumentElement; ParentNode := Doc.CreateElement('Anrede'); VarElemen := Doc.CreateTextNode('Herr'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); ParentNode := Doc.CreateElement('Vorname'); VarElemen := Doc.CreateTextNode('Michael'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); ParentNode := Doc.CreateElement('Nachname'); VarElemen := Doc.CreateTextNode('Lücker'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); ParentNode := Doc.CreateElement('Alter'); VarElemen := Doc.CreateTextNode('19'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); DatenNode := Doc.DocumentElement.FindNode('Daten'); DatenNode.AppendChild(RootNode); WriteXMLFile(Doc, 'MusterNeu.xml'); finally Doc.Free; end; end; |
AW: Wert in XML finden?
Delphi-Quellcode:
In der letzen Zeile überschreist Du die Adresse des RootNodes.
procedure TForm1.Button3Click(Sender: TObject);
var Doc: TXMLDocument; RootNode, ParentNode, DatenNode, VarElemen: TDOMNode; begin try ReadXMLFile(Doc, 'Muster.xml'); //Doc := TXMLDocument.Create; RootNode := Doc.CreateElement('Personen'); Doc.Appendchild(RootNode); RootNode:= Doc.DocumentElement; Mag sein, dass das nicht so sein soll - wie schaut denn Dein Ergebnis aus? Grüße Klaus |
AW: Wert in XML finden?
Stimmt, das habe ich übersehen. Mein Ergebnis sieht so aus, aber irgendwie werde ich nicht warm damit, irgendwo ist da noch ein Fehler, denn ich nicht sehe.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var Doc: TXMLDocument; RootNode, ParentNode, DatenNode, VarElemen: TDOMNode; begin try ReadXMLFile(Doc, 'Muster.xml'); RootNode := Doc.CreateElement('Personen'); Doc.Appendchild(RootNode); ParentNode := Doc.CreateElement('Anrede'); VarElemen := Doc.CreateTextNode('Herr'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); ParentNode := Doc.CreateElement('Vorname'); VarElemen := Doc.CreateTextNode('Michael'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); ParentNode := Doc.CreateElement('Nachname'); VarElemen := Doc.CreateTextNode('Locker'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); ParentNode := Doc.CreateElement('Alter'); VarElemen := Doc.CreateTextNode('29'); ParentNode.Appendchild(VarElemen); RootNode.AppendChild(ParentNode); DatenNode := Doc.DocumentElement.FindNode('Daten'); DatenNode.AppendChild(RootNode); WriteXMLFile(Doc, 'MusterNeu.xml'); finally Doc.Free; end; end; |
AW: Wert in XML finden?
.. mit Ergebnis meinte ich die erstellt XML Datei.
Werden die Konten zu den falschen Knoten hinzugefügt? Grüße Klaus |
AW: Wert in XML finden?
Zitat:
|
AW: Wert in XML finden?
.. wann kommt die Fehlermeldung (bitte mal mit F8 durch den Code gehen)?
Das Tutorial ![]() Grüße Klaus |
AW: Wert in XML finden?
Zitat:
Delphi-Quellcode:
Das Tutorial kenne ich, da gucke ich auch, bin aber in dem Thema XML noch nicht ganz drin.
RootNode := Doc.CreateElement('Personen');
Doc.Appendchild(RootNode); |
AW: Wert in XML finden?
.. kommentiere doch mal " Doc.Appendchild(RootNode); " aus.
Grüße Klaus |
AW: Wert in XML finden?
Zitat:
|
AW: Wert in XML finden?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab's jetzt so gelöst:
Delphi-Quellcode:
Der Nachteil ist nur, dass für den <Personen>-Knoten es keinen <Root>-Knoten gibt, man kann somit nicht mehrere Personen anlegen, des weiteren erscheint die neue Person im <Header>-Knoten statt <Daten>-Konoten.
procedure TForm1.Button3Click(Sender: TObject);
var Doc: TXMLDocument; RootNode, ParentNode, DatenNode, VarElemen, ElementNode, ItemNode, TextNode: TDOMNode; begin try ReadXMLFile(Doc, 'Muster.xml'); //Doc := TXMLDocument.Create; //RootNode := Doc.CreateElement('Daten2'); //Doc.Appendchild(RootNode); //RootNode:= Doc.DocumentElement; ElementNode := Doc.CreateElement('Personen'); ItemNode:=Doc.CreateElement('Anrede'); TextNode:=Doc.CreateTextNode('Herr'); ItemNode.AppendChild(TextNode); ElementNode.AppendChild(ItemNode); ItemNode:=Doc.CreateElement('Vorname'); TextNode:=Doc.CreateTextNode('Tim'); ItemNode.AppendChild(TextNode); ElementNode.AppendChild(ItemNode); ItemNode:=Doc.CreateElement('Alter'); TextNode:=Doc.CreateTextNode('19'); ItemNode.AppendChild(TextNode); ElementNode.AppendChild(ItemNode); //RootNode.AppendChild(ElementNode); DatenNode := Doc.DocumentElement.FindNode('Header'); DatenNode.AppendChild(ElementNode); WriteXMLFile(Doc, 'MusterNeu2.xml') finally Doc.Free; end; end; |
AW: Wert in XML finden?
Es scheint an dieser Zeile zu scheitern - "Doc.Appendchild(RootNode);"
Das mach wohl den Knoten RootNode zum Root-Knoten im Doc, und das muss bereits vorhanden bzw. besetzt sein, und daher der Fehler. Kann das sein? |
AW: Wert in XML finden?
Guten Abend,
das Teilmacht was Du ihm sagst
Delphi-Quellcode:
Demnach wird der neue <Personen> Knoten an den Header angehängt.
DatenNode := Doc.DocumentElement.FindNode('Header');
DatenNode.AppendChild(ElementNode); Der gemeinsame Aufhänger für die Personen ist aber der <Daten> Knoten. Grüße Klaus |
AW: Wert in XML finden?
Zitat:
|
AW: Wert in XML finden?
Delphi-Quellcode:
macht das obige einen Unterschied?
DatenNode := Doc.DocumentElement.FindNode('Header').FindNode('Daten');
DatenNode.AppendChild(ElementNode); Grüße Klaus |
AW: Wert in XML finden?
Liste der Anhänge anzeigen (Anzahl: 1)
Das geht? Klasse, jetzt funkt es! Riiiiiesen Dank Dir!
Jetzt aber noch eine Hürde. Ich muss ja zwei Personen einfügen. Wie kann ich das gleiche Element bzw. <Personen>-Konoten noch einmal anlegen, ohne das erste zu überschrieben? |
AW: Wert in XML finden?
Delphi-Quellcode:
erstellt doch bei jedem Aufruf einem neuen Knoten oder?
ElementNode := Doc.CreateElement('Personen');
Damit wird der alte nicht überschrieben. Ich würde das ganze anfügen in eine Methode mit entsprechenden Parametern auslagern. Grüße Klaus |
AW: Wert in XML finden?
Zitat:
Wahrscheinlich weil ich keinen Root-Knoten habe. Aber wenn ich diesen anlege, dann kann ich mein Konstrukt nicht in die bestehende XML einfügen, da es wohl zu Root-Konflikten kommt. |
AW: Wert in XML finden?
Delphi-Quellcode:
wenn Du nach diesem Prinzip vorgehst, liest Du aus Muster.xml ein machst Änderungen und speicherst unter MusterNeu2.xml ab.
procedure TForm1.Button3Click(Sender: TObject);
var Doc: TXMLDocument; RootNode, ParentNode, DatenNode, VarElemen, ElementNode, ItemNode, TextNode: TDOMNode; begin try ReadXMLFile(Doc, 'Muster.xml'); // tue etwas mit dem XMLDoc WriteXMLFile(Doc, 'MusterNeu2.xml') finally Doc.Free; end; end; Dann liest Du beim nächsten ButtonClick wieder Muster.xml ein (da sind keine Änderungen drin) machst wieder Änderungen und speicherst (überschreibst) MusterNeu2.xml. Damit sind die ersten Änderungen weg. Grüße Klaus |
AW: Wert in XML finden?
Kam jetzt wieder dazu hier weiterzumachen. Und es hat alles super geklappt, noch mal an der Stelle vielen Dank!
Noch eine Frage hätte ich, ich möchte den Knoten <Daten> löschen, versuche ich auch, aber irgendwas mache ich falsch, und sehe nicht was.
Code:
<PDB>
<Header> <Daten> <Personen> <Anrede>Herr</Anrede> <Vorname>Otto</Vorname> <Nachname>Müller</Nachname> <Alter>45</Alter> </Personen> </Daten> </Header> </PDB>
Delphi-Quellcode:
DatenNode := Doc.DocumentElement.FindNode('PDB').FindNode('Header');
DatenNode.RemoveChild(DatenNode); |
AW: Wert in XML finden?
Delphi-Quellcode:
Wenn Du den Knotennamen angibst?
DatenNode := Doc.DocumentElement.FindNode('PDB').FindNode('Header');
DatenNode.RemoveChild('Daten'); Grüße Klaus |
AW: Wert in XML finden?
Zitat:
|
AW: Wert in XML finden?
Delphi-Quellcode:
DatenNode := Doc.DocumentElement.FindNode('PDB').FindNode('Header');
DatenNode.RemoveChild(DatenNode.FindNode('Daten'));
Delphi-Quellcode:
wie gesagt ich kenne Deine Library nicht.
DatenNode.RemoveChild.FindNode('Daten');
Grüße Klaus |
AW: Wert in XML finden?
Ich verwende die Standard uses von Lazarus, also XMLRead, XMLWrite und DOM.
|
AW: Wert in XML finden?
Zitat:
Ich habe leider kein Lazarus installiert. Grüße Klaus |
AW: Wert in XML finden?
Leider nicht, habe jetzt auch die Fehlermeldung nicht mehr im Kopf, muss später schauen.
|
AW: Wert in XML finden?
Die Fehlermeldung heißt:
Code:
Hat vielleicht noch jemand eine Idee?
main.pas(50,15) Error: Wrong number of parameters specified for call to "RemoveChild"
|
AW: Wert in XML finden?
Ich hab's. :thumb: Die Doku über DOM hat die Klarheit geschaffen. :thumb:
Vielen Dank, vorallem Dir Klaus! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr. |
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