Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Datei bearbeiten und nur Teile wieder speichern (https://www.delphipraxis.net/109379-datei-bearbeiten-und-nur-teile-wieder-speichern.html)

Hoschie 29. Feb 2008 07:49


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:
<root>
  <Element1>
    <Element1.1>
      <Element1.1.1>bla</Element1.1>
      <Element1.1.2>bla</Element1.2>
    </Element1.1>
  </Element1>
  ......usw.....
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.
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

alleinherrscher 29. Feb 2008 08:34

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:

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);
Das ganze könnte man dann in eine procedure schreiben, z.B.

Delphi-Quellcode:

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;
Mit der Procedur würde dein Programm dann so aussehen:

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);

Hoschie 29. Feb 2008 09:05

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.

alleinherrscher 29. Feb 2008 09:31

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?

Hoschie 29. Feb 2008 20:47

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

marabu 1. Mär 2008 12:55

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:
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;
Freundliche Grüße

Hoschie 1. Mär 2008 13:51

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:
<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>
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 ?

Vielen Dank,

Hoschie

Bernhard Geyer 1. Mär 2008 14:00

Re: Datei bearbeiten und nur Teile wieder speichern
 
Zitat:

Zitat von marabu
XML-Dokumente lassen sich am besten verarbeiten, wenn du sie in ein Document Object Model (DOM) überführst.

Full Ack! Jede Lösung mittels "normale" Stringfunktionen wird spätestens dann scheitern wenn Elemente mit Sonderzeichen eleminiert werden müssen und die Codierung immer unterschiedlich ist. Auch sind Zeilenumbrüche (CRLF) nicht zwingen in XML-Dateien nötig. Also lesen jeweiliger Elemente mit readln wird dann auch probleme bereiten.

Hoschie 1. Mär 2008 17:25

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:

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 ?
Gruß
Hoschie

marabu 1. Mär 2008 17:43

Re: Datei bearbeiten und nur Teile wieder speichern
 
In der DP Code-Library habe ich etwas gefunden: MSXML

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 13:04 Uhr.
Seite 1 von 6  1 23     Letzte »    

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