Entwickler-Ecke

Dateizugriff - XML - Datei lesen und formatiert wegschreiben


Gagamba - Di 24.02.15 21:05
Titel: XML - Datei lesen und formatiert wegschreiben
Hallo,
ich bin ein XML-Laie und habe das Problem, eine XML-Datei parsen zu müssen, um sie mit Variablen zu versorgen. Das ging bisher ganz gut, weil die Quell-XML schön zeilenorientiert aufgebaut war, und ich daher die Zeilen einzeln interpretieren konnte. Jetzt aber krieg ich XML-Dateien, deren Inhalt aus einer einzigen String-Schlange besteht. Zum Texten bräuchte ich aber dringend die übersichtliche 'alte' Zeilenstruktur. Daher wollt ich die neue Datei einfach einlesen, und zeilenorientiert wegschreiben, was - so habe ich die Delphi-Hilfe verstanden - mit der Eigenschaft XML innerhalb TXMLDodument auch gehen sollte. Geht aber nicht, ich krieg nur eine identische Kopie der 'Zeichenschlange':

Delphi-Quelltext
1:
2:
3:
xdoc := txmldocument.Create(src);
xdoc.xml.savetofile(tgt);
xdoc.free;

Ich hab auch das versucht anstelle xml.savetofile:

Delphi-Quelltext
1:
xdoc.Savetofile(tgt);                    
aber das führt zum selben Ergebnis.

Wie mach ich das? Zum Testen ist zeilenorientierte, übersichtliche XML-Dateien unersetzlich!

Danke: Siegfried

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 25.02.2015 um 12:03


jfheins - Di 24.02.15 21:11

Wenn es eh nur zum testen ist, kannst du doch die XML Datei einfach im Editor laden und formatieren. Oder nen Online-Formatter [http://www.freeformatter.com/xml-formatter.html] hernehmen.

Für das richtige Programm benutzt du ja sicher einen ordentlichen XML-Parser, so dass mehr oder weniger Whitespace zwischen den Tags absolut keinen Einfluss auf das Ergebnis des Parsing hat, oder?? :gruebel:


Gagamba - Di 24.02.15 21:20

Hallo, das 'manuell' zu machen ist zu aufwändig: die Quelldatei ist riesengroß!


Narses - Di 24.02.15 21:29

Moin!
Öffne die XML-Datei doch einfach mal in einem Browser deiner Wahl... :gruebel: :les: :think:

cu
Narses


Gagamba - Di 24.02.15 23:41

Hallo,
klar, aber wie wandle ich sie dann in eine 'zeilenorientierte' xml-datei um? was ist den an meinem code-schnipsel (siehe oben) falsch? bzw. was habe ich bei xml.savetofile falsch verstanden?


Lemmy - Mi 25.02.15 08:59

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
klar, aber wie wandle ich sie dann in eine 'zeilenorientierte' xml-datei um?


gar nicht - XML Manipulation macht man nach dem Parsen mit den entsprechenden Werkzeugen. Das macht man nur dann von Hand, wenn der Parser das XML nicht verarbeitet (weil es z.B. fehlerhaft ist). Und gerade wenn Du Neuling in XML bist, dann mach es richtig und verwende nicht eine Zange um eine Schraube zu drehen.

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:

was ist den an meinem code-schnipsel (siehe oben) falsch? bzw. was habe ich bei xml.savetofile falsch verstanden?


vermutlich die OH - oder dort steht es falsch drin.

Wenn Du das zum Kontrollieren zeilenorientiert brauchts, dann lass dir die XML wie schon beschrieben im Browser anzeigen (da ist es zeilenorientiert) oder verwende von MS den XML Notepad (dort öffnen und dann speichern) oder verwende XML Spy (kostenpflichtig)


jasocul - Mi 25.02.15 09:00

Dein Code-Schnipsel ist richtig.
Aber warum sollte Delphi das für dich umformatieren? Es handelt sich um gültiges XML-Format. Es gibt keinen Grund, dass das Öffnen und sofortige wieder Speichern dir plötzlich die Zeilenumbrüche einbaut.

Dein Ansatz ist falsch.
Du hättest dich mit XML beschäftigen müssen, damit du richtig damit umgehst, anstatt die Datei manuell zu parsen. Wenn du die Zeit dafür hast, beschäftige dich damit und programmiere den notwendigen Teil neu. Mit XML wirst du sicher noch an anderer Stelle zu tun bekommen.

Zum Testen:
Es gibt genügend Editoren, die XML aufbereiten kann. Ich benutze Notepad++ mit einem Addon. Dieses baut die Zeilenumbrüche und Einrückungen ein, damit es lesbar wird. Speichern kann man es dann auch mit der neuen Formatierung.


Gagamba - Mi 25.02.15 10:44

@ Lemmy.
danke, aber ich will es ja nicht anziegen lassen, sondern aufgrund der größe per programm zeilenweise(!) auf fehler checken. daher sollte auch das zerschnipseln in einzelne zeilen übers programm und eben nicht 'manuell' oder mit einem fremd-viewer passieren.
du schreibst von 'geeigneten werkzegen' zum umformattieren: welche denn?
Siegfried

Moderiert von user profile iconNarses: Beiträge zusammengefasst

@ jasocul:
im prinzip dasselbe wie an lemmy (siehe oben)...
in der delphi-hilfe (die ich vermutlich gründlich missverstanden habe) steht halt, dass die property XML das ganze zeilenweise rausschreibt, im gegensatz zu den anderen schreib-methoden: wenn ich dann immer dasselbe ergebnis kriege, dann wundert mich das.
du hast völlig recht, dass es sinnvoll wäre, das xml-format gründlich zu lernen, aber dafür fehlt die zeit (und auch die lust), es ist sehr unübersichtlich. und eigentlich würde es das problem nicht lösen.
Gruß


OlafSt - Mi 25.02.15 11:59

Für mich sieht das ganze hier nach einer "Ich kann nicht von meiner Denk-Schiene runter"-Problematik aus ;)

TXMLDocument kann die Datei schon mal ohne mosern einlesen. Damit sind viele Dinge geprüft: Die Syntax stimmt, die Tags sind alle ordentlich geöffnet und geschlossen, keine Verschachtelungen und so weiter. Ein großteil von Fehlern ist bereits dadurch ausgeschlossen, das die Datei von einem XML-Parser überhaupt geschluckt wird.

Anschließend wären noch Tests aus Groß-Kleinschreibung ggf. erforderlich, oder unbekannte Tags. Aber dazu muß man die Datei nicht noch einmal parsen, das hat XMLDocument schon getan. Die ganzen Tags stehen nun als Baumstruktur eh schon zur Verfügung und brauchen nur noch abgetestet werden.

IMHO ist es cool, das du einen XML-Parser gemacht hast - aber eigentlich war das vertane Zeit.

Ansonsten wäre es vllt. nützlich zu wissen, was denn da getestet werden muß. Womöglich gibts noch andere Möglichkeiten.


Narses - Mi 25.02.15 12:27

Moin!

Ich fasse mal zusammen, was hier bisher passiert ist: ;)

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
Zum Testen ist zeilenorientierte, übersichtliche XML-Dateien unersetzlich!
Dazu hast du den Tipp bekommen, die XML-Datei im Browser anzeigen zu lassen. Das ist funktionsfähig getestet, ich mache das selbst auch so.

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
du schreibst von 'geeigneten werkzegen' zum umformattieren: welche denn?


user profile iconOlafSt hat folgendes geschrieben Zum zitierten Posting springen:
Für mich sieht das ganze hier nach einer "Ich kann nicht von meiner Denk-Schiene runter"-Problematik aus ;)
Entweder das oder der TE hat uns nicht genug Informatinen für eine sinnvolle "Beratung" gegeben. ;)

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
und eigentlich würde es das problem nicht lösen.
user profile iconOlafSt hat folgendes geschrieben Zum zitierten Posting springen:
Ansonsten wäre es vllt. nützlich zu wissen, was denn da getestet werden muß. Womöglich gibts noch andere Möglichkeiten.
Ich schließe mich an und werde auch keine weiteren, nicht zielgerichteten Tipps geben. Vielleicht solltest du, user profile iconGagamba, doch nochmal versuchen, dein eigentliches Problem zu schildern - dabei aber bitte unverfälscht von deiner Erwartungshaltung, wie genau das zu lösen ist. :zustimm: Wir können nicht sinnvoll helfen, wenn wir gar nicht wissen, wobei eigentlich. Du hast gesagt, du kennst dich mit XML nicht gut aus, dann lass dich beraten und nimm zumindest mit, dass es für Leute, die besser mit XML zurecht kommen, komisch klingt, dass du als Lösungsweg die Formatierung einer XML-Datei ansiehst (denn das ist es nicht). Vielleicht gibt es ja einen deutlich besseren (und einfacheren, schnelleren) Weg, nur du kennst ihn nicht. :idea:

cu
Narses


Gagamba - Mi 25.02.15 12:42

Hallo,
ich wurde gebeten, mein Problem nochmal zu schildern, und versuche das in aller Kürze:
ich brauche eine von dritten gelieferte xml-Datei per programm (also nicht manuell selber gemacht in einem editor) umformatiert auf eine zeilenorientierte darstellung. das warum und wieso lass ich einfach mal weg.
Danke!


Nersgatt - Mi 25.02.15 12:48

Ich glaube, Du suchst sowas wie
xmlDoc.Options := xmlDoc.Options + [doNodeAutoIndent];
Damit wird es vermutlich funktionieren, wie Du es erwartest (habs nicht ausprobiert). Eine XML-Datei selbst zu interpretieren ist aber trotzdem der falsche Weg. Das sollte man einem entsprechenden Parser überlassen.


Gagamba - Mi 25.02.15 13:07

.. das mit den Options probier ich mal aus, danke.
Allerdings interpretier ich die xml-datei nicht, ich möchte nur "beobachten", was darin auf dateiebene passiert, und das ist in einer dati mit tausenden von einzelzeichen nicht möglich (jedenfalls nicht mit meinen tools), da brauch ich halt die zeilenstruktur.
Siegfried


Narses - Mi 25.02.15 13:34

Moin!

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings interpretier ich die xml-datei nicht, ich möchte nur "beobachten", was darin auf dateiebene passiert, und das ist in einer dati mit tausenden von einzelzeichen nicht möglich (jedenfalls nicht mit meinen tools), da brauch ich halt die zeilenstruktur.
Ah, jetzt wird es schon spannender... 8) Dir ist aber schon klar, dass der Ansatz "Textvergleich von XML-Daten" auch so nicht wirklich möglich ist? :lupe: :gruebel: :nixweiss: Nur ein Beispiel: wenn du die Reihenfolge zweier Nodes (oder noch viel gemeiner: die Reihenfolge von Attributen) vertauscht, dann ist die XML-Datei immer noch "gleich" (im XML-Sinne), aber die serialisierte Darstellung (die "Textdatei") unterscheiden sich. :shock:

Und noch was zum nachlesen: http://www.computerwoche.de/a/unterschiede-zwischen-xml-daten-finden,1064297

cu
Narses


Lemmy - Mi 25.02.15 13:44

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
ich wurde gebeten, mein Problem nochmal zu schildern, und versuche das in aller Kürze:
ich brauche eine von dritten gelieferte xml-Datei per programm (also nicht manuell selber gemacht in einem editor) umformatiert auf eine zeilenorientierte darstellung. das warum und wieso lass ich einfach mal weg.
Danke!


ich wieder hole mich:
XMLNotepad von Microsoft: dort laden, speichern, gut ist.


Gagamba - Mi 25.02.15 14:06

@ Lemmy:
ich wiederhole mich: ich baruche keine 'manuelle' Lösung, sondern eine, die innerhalb des Programms vorgenommen wird!
Siegfried

Moderiert von user profile iconNarses: Beiträge zusammengefasst

@ Nersgatt:
ich habs mit der Option probiert, hat leider nicht funktioniert, ich kriege trotzdem immer identische Kopien der source-Datei.
trotzdem danke für den Tipp: Siegfried

Moderiert von user profile iconNarses: Beiträge zusammengefasst

@ Narses:
ich habe ja nicht vor, irgendwelche nodes zu vertauschen!
Im Gegenteil soll der INHALT der Datei unverändert bleiben, nur die Art der Speicherung soll anders sein.
statt z.B. (fantasiestrings)

<data asdasdlkasldkjasdlk><data jasldkasldkhasdklh><data asdklhaslkdhadsklhallskdhlkdhskldhdkl>

soll NEU die datei so aussehen:

<data asdasdlkasldkjasdlk>
<data jasldkasldkhasdklh>
<data asdklhaslkdhadsklhallskdhlkdhskldhdkl>

also keine zeichenschlange mehr, sondern zeilenweise geordnet.
drück ich mich denn wirklich so unklar aus?
Siegfried


Narses - Mi 25.02.15 14:21

Moin!

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
drück ich mich denn wirklich so unklar aus?
Das hab ich mich auch grade gefragt... :zwinker:

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
ich habe ja nicht vor, irgendwelche nodes zu vertauschen!
Im Gegenteil soll der INHALT der Datei unverändert bleiben, nur die Art der Speicherung soll anders sein.
Das habe ich verstanden. :zustimm:

Versuch doch aber bitte nochmal den Punkt, den ich oben angesprochen habe, zu durchdenken: es ist im XML-Format egal, in welcher Reihenfolge Nodes auftreten (die Daten sind "gleich"), aber in der serialisierten Darstellung des XML-Formates können trotzdem Unterschiede auftreten (die "Texte" sind "nicht gleich"). :idea: Wenn du also auf der "Text-Ebene" XML-Daten vergleichen willst, dann kann da ein Unterschied auftreten, der gar keiner ist. :nixweiss: Ist dir das klar? (OK, das kann dir schon klar, aber egal sein :? deshalb ja die Frage, was du da genau tust :idea:)

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
soll NEU die datei so aussehen:
Dann lade dir doch mal bitte das XMLStarlet-Paket von oben runter, pack die xml.exe aus und tu sie zusammen mit einer XML-Datei in ein Verzeichnis, dann machst du eine cmd in diesem Verzeichnis auf und gibst ein:

Quelltext
1:
xml.exe fo -o -n test.xml                    

Ist das das, was du möchtest?

cu
Narses


Gagamba - Mi 25.02.15 14:43

Hallo,
hab ich gemacht:
xml.exe fo -o -n test.xml
danach browsen am bildschirm viele zeichen herum, aber die test.xml sieht danach noch genauso aus wie vorher..
die -help - option von xml ist ausgesprochen dürftig, damit komm ich leider auch nicht weiter.
und - selbst wenn es klappen würde - ich brauch ja keine kommandozeilenlösung, sondern eine, die innerhalb meines delphi-programms funktioniert!
Siegfried


Narses - Mi 25.02.15 14:46

Moin!

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
danach browsen am bildschirm viele zeichen herum, aber die test.xml sieht danach noch genauso aus wie vorher..
OK :? dann gib mal bitte das hier ein:

Quelltext
1:
xml.exe fo -o -n test.xml >neu.xml                    
Dann werden die Ausgaben in die neu.xml geschrieben. Sieht das dann so aus, wie das, was du gerne hättest?

user profile iconGagamba hat folgendes geschrieben Zum zitierten Posting springen:
ich brauch ja keine kommandozeilenlösung, sondern eine, die innerhalb meines delphi-programms funktioniert!
Auch das habe ich verstanden. ;) Eins nach dem anderen. :zustimm:

cu
Narses


whitef - Sa 24.10.15 18:05

hi,
falls ich deine Frage richtig verstanden habe möchtest du aus zb. so etwas:

XML-Daten
1:
<?xml version="1.0" encoding="Windows-1252" standalone="no"?><DB><db_0><e01>test</e01><e02>test</e02><e03>test</e03><e04>test</e04><e05>test</e05><e06>test</e06><e07>test</e07><e08>test</e08><e09>test</e09><e10>test</e10></db_0></DB>                    


so etwas machen:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<?xml version="1.0" encoding="Windows-1252" standalone="no"?>
<DB>
  <db_0>
    <e01>test</e01>
    <e02>test</e02>
    <e03>test</e03>
    <e04>test</e04>
    <e05>test</e05>
    <e06>test</e06>
    <e07>test</e07>
    <e08>test</e08>
    <e09>test</e09>
    <e10>test</e10>
  </db_0>
</DB>


Falls ja:
Ich habe hierfür die "TJvSimpleXML" Komponente von JVCL [http://jvcl.delphi-jedi.org] benutzt und folgender Code hat auf anhieb zum ziel geführt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.btSpeichernClick(Sender: TObject);
begin
  if fileexists(DB_Filepath) then
  begin
    SimpleXml.LoadFromFile(DB_Filepath);
    SimpleXml.SaveToFile(DB_Filepath);
  end;
end;