![]() |
Datei bearbeiten und nur Teile wieder speichern
Guten Morgen Delphi-Meister,
entschuldigt den merkwürdigen Titel, aber genau das beschreibt meine Frage am besten. Zur Situation: Ich habe eine XML Datei, die aus mehreren Elementen besteht. Zum Beispiel :
Delphi-Quellcode:
Nun möchte ich alles ab z.B. Element3 bis zum Schluss auslesen und in eine andere Datei schreiben. Die root soll erhalten beliben. Habe schon die SuFu genutzt aber nichts erklärendes gefunden.
<root>
<Element1> <Element1.1> <Element1.1.1>bla</Element1.1> <Element1.1.2>bla</Element1.2> </Element1.1> </Element1> ......usw..... Ist hier vielleicht jemand der mir das erklären kann? Es muss ja nicht unbedingt eine Lösung sein, eine Erklärung mit dem ein oder anderen Hinweis wäre schön. Erarbeiten würde ich das dann gerne selber. Gruß Hoschie |
Re: Datei bearbeiten und nur Teile wieder speichern
Wie ließt du denn die Datei ein? Also wenn du sie zeilenweise mit Readln einließt sollte das eig. kein Problem sein:
Du ließt alles bis zu der Zeile nach <root> ein: (is jetzt n bisschen primitiver code)
Delphi-Quellcode:
Das ganze könnte man dann in eine procedure schreiben, z.B.assignfile(textfile1,filename1); //textfile1 aus dem gelesen werden soll reset(textfile1); assignfile(textfile2,filename2); //textfile2 in das geschrieben werden soll rewrite(textfile2); a:=''; while (not a='<root>') or (not eof(textfile1)) do begin readln(textfile1,a); writeln(textfile2,a); end; a:=''; while (not a='Element3') or (not eof(textfile1)) do readln(textfile1,a); a:=''; while (not eof(textfile1)) do begin readln(textfile1,a); writeln(textfile2,a); end; closefile(textfile1); closefile(textfile2);
Delphi-Quellcode:
Mit der Procedur würde dein Programm dann so aussehen:procedure CopyLines(FromFile,ToFile:textfile; TerminateString:String; seekonly:boolean); var a:string; begin a:=''; while (TerminateString='' or (not a=TerminateString)) or (not eof(textfile1)) do begin readln(textfile1,a); if not seekonly then writeln(textfile2,a); end; end;
Delphi-Quellcode:
assignfile(textfile1,filename1); //textfile1 aus dem gelesen werden soll
reset(textfile1); assignfile(textfile2,filename2); //textfile2 in das geschrieben werden soll rewrite(textfile2); CopyLines(textfile1,textfile2,'<root>',false); CopyLines(textfile1,textfile2,'Eingabe3',true); CopyLines(textfile1,textfile2,'',false); |
Re: Datei bearbeiten und nur Teile wieder speichern
Moin,
ist es denn so, dass er automatisch alle Unterelemete von Element3 dann mit einliest und wegspeichert? Und wie übernimmt er dann die schließenden Tags ? Aber danke schonmal. |
Re: Datei bearbeiten und nur Teile wieder speichern
Oh, ahso, du willst die unterelemente mit ham...dann sag doch, dass er bis zu element4 speichern soll und programmier die procedur so um, dass er TerminateString selbst nicht mehr mitspeichert, wäre das ne Idee?
|
Re: Datei bearbeiten und nur Teile wieder speichern
Nabend,
da muss ich mich jetzt erstmal reinwurschtln. Ich versuchs mal, schauen wir was dabei rauskommt. Vielen Dank erstmal, wenns Probleme gibt, melde ich mich wieder :mrgreen: Gruß Hoschie |
Re: Datei bearbeiten und nur Teile wieder speichern
Hallo Hoschie,
XML-Dokumente lassen sich am besten verarbeiten, wenn du sie in ein Document Object Model (DOM) überführst. Die Software-Industrie hat gemeinsam ein solches Modell spezifiziert und es gibt eine ganze Reihe von Implementierungen. Eine steckt z.B. in den Microsoft XML Core Services (MSXML4.DLL oder neuer), die auf jedem Windows PC vorhanden sind. Falls deine Delphi-Version ohne die Unit MSXML daher kommt, dann kannst du für diese DLL einen Wrapper (MSXML2) erzeugen. Ich muss dein Problem etwas umformulieren, damit ich ein Beispiel geben kann: In einem XML-Dokument sollen die ersten beiden Unterknoten des Wurzelknoten entfernt werden?
Delphi-Quellcode:
Freundliche Grüße
uses
MSXML; var fnOld, fnNew: TFileName; xd: IXMLDOMDocument; begin // fnOld := 'c:\daten\dp\books.xml'; // fnNew := 'c:\daten\dp\books-mod.xml'; xd := CoDomDocument.Create; xd.async := False; if xd.load(fnOld) then begin with xd.documentElement do begin removeChild(childNodes[1]); removeChild(childNodes[0]); end; xd.save(fnNew); end; end; |
Re: Datei bearbeiten und nur Teile wieder speichern
Hi,
das ist ein interessanter Ansatz, so könnte ich eventuell sogar schon vor dem abspeichern, das rausfiltern was ich benötige und halte so die Datenmenge in der Datei um ein vielfaches kleiner. Im Endeffekt benötige ich nur ein kleinen Teil der runtergeladenen Datei. Diese sieht ungefähr so aus :
Delphi-Quellcode:
Der kleine Teil, den ich jetzt benötige liegt in <daten> und dann <Lehrgänge>, den anderen Kram brauche ich nicht. Verhält es sich da änlich mit den ChildNodes ? Was wäre einfacher, die anderen zu entfernen oder den benötigten rauszukopieren ?
<root>
<sprache> <text></text> </sprache> <systemdaten> <einstellungen></einstellungen> <zeiten></zeiten> </systemdaten> <daten> <id></id> <name></name> <Lehrgänge></lehrgänge> </daten> <Orte> <stadt1></stadt1> <stadt2></stadt2> </Orte> </root> Vielen Dank, Hoschie |
Re: Datei bearbeiten und nur Teile wieder speichern
Zitat:
|
Re: Datei bearbeiten und nur Teile wieder speichern
Habt Ihr vielleicht ein paar Tipps, wie ds mit dem Wrapper funktioniert ? Ich denke nicht, dass die 2005 PE mit MSXML Unit ohne weiteres läuft, jedenfalls kennt er die nicht. Die Suche konnte mir da nicht weiterhelfen, oder habe ich etwas übersehen ?
Und habt ihr vielleicht dazu noch was : Zitat:
Hoschie |
Re: Datei bearbeiten und nur Teile wieder speichern
In der DP Code-Library habe ich etwas gefunden:
![]() Da ist bestimmt auch für dich etwas dabei. Zu deinem Projekt: Gibt es da nur ein einziges Element Lehrgänge? XML ist übrigens case-sensitive! Lehrgänge <> lehrgänge |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 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