AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Datei bearbeiten und nur Teile wieder speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Datei bearbeiten und nur Teile wieder speichern

Ein Thema von Hoschie · begonnen am 29. Feb 2008 · letzter Beitrag vom 8. Mär 2008
Antwort Antwort
Seite 1 von 6  1 23     Letzte »    
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#1

Datei bearbeiten und nur Teile wieder speichern

  Alt 29. Feb 2008, 08:49
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
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 29. Feb 2008, 09:34
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);
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 29. Feb 2008, 10:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 29. Feb 2008, 10:31
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?
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 29. Feb 2008, 21:47
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

Gruß
Hoschie
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 13:55
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
  Mit Zitat antworten Zitat
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 14:51
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 15:00
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Hoschie

Registriert seit: 7. Feb 2006
41 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 18:25
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Datei bearbeiten und nur Teile wieder speichern

  Alt 1. Mär 2008, 18:43
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 6  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 23:21 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