Autor Beitrag
Gagamba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Di 24.02.15 21:05 
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':
ausblenden Delphi-Quelltext
1:
2:
3:
xdoc := txmldocument.Create(src);
xdoc.xml.savetofile(tgt);
xdoc.free;

Ich hab auch das versucht anstelle xml.savetofile:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Di 24.02.15 21:20 
Hallo, das 'manuell' zu machen ist zu aufwändig: die Quelldatei ist riesengroß!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 24.02.15 21:29 
Moin!
Öffne die XML-Datei doch einfach mal in einem Browser deiner Wahl... :gruebel: :les: :think:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Gagamba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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ß


Zuletzt bearbeitet von Gagamba am Mi 25.02.15 10:51, insgesamt 1-mal bearbeitet
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: 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.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
    kannst du doch die XML Datei einfach im Editor laden und formatieren.
    OK, manuell ist nur der Vollständigkeit halber in der Liste, hast du ja schon als zu aufwändig, weil zu viel, beschrieben

  • user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
    Oder nen Online-Formatter hernehmen.
    bzw. Webtools dazu ganz allgemein, Google hilft da sicher weiter

  • user profile iconLemmy hat folgendes geschrieben Zum zitierten Posting springen:
    verwende von MS den XML Notepad (dort öffnen und dann speichern)

  • user profile iconLemmy hat folgendes geschrieben Zum zitierten Posting springen:
    verwende XML Spy (kostenpflichtig)

  • user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
    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.


    Und von mir gibt´s noch zwei Tipps oben drauf:
  • Mit UltraEdit oder UEStudio (beides leider kostenpflichtig) kann man auch per Mausklick eine XML formatieren

  • XMLStarlet ist eine Sammlung von Kommandozeilen-Tools, die mit den geeigneten Parametern auch formatieren können (hab ich bereits getan, kann mich aber nicht mehr an die Parameter erinnern)


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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Gagamba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Gagamba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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: www.computerwoche.de...daten-finden,1064297

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden Quelltext
1:
xml.exe fo -o -n test.xml					

Ist das das, was du möchtest?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Gagamba Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
whitef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 202
Erhaltene Danke: 1

Windows X
Delphi XE X
BeitragVerfasst: Sa 24.10.15 18:05 
hi,
falls ich deine Frage richtig verstanden habe möchtest du aus zb. so etwas:
ausblenden 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:
ausblenden 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 benutzt und folgender Code hat auf anhieb zum ziel geführt:
ausblenden 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;