(zu alt für eine Antwort)
Grosse xml Datei ohne Zeilenumbruch bearbeiten bzw formatieren
Wolfgang Klein
2011-07-05 10:50:12 UTC
Hallo,

ich habe hier eine große (500kB) XML-Datei, in der jedoch kein einziger
Zeilenumbruch vorhanden ist. Ich möchte diese Datei gerne editieren,
aber kate schmiert ab und mit vim ist das zu unübersichtlich.

Mit welchem Editor kriege ich die Datei bearbeitet, bzw wie kann ich sie
besser formatieren?



Wolfgang Klein
--
,_,
(o,o) Mit dem Wissen wächst der Zweifel.
{' '} (J.W.v.Goethe)
=#=#= www.NachDenkSeiten.de
Josef Moellers
2011-07-05 11:06:36 UTC
Post by Wolfgang Klein
Hallo,
ich habe hier eine große (500kB) XML-Datei, in der jedoch kein einziger
Zeilenumbruch vorhanden ist. Ich möchte diese Datei gerne editieren,
aber kate schmiert ab und mit vim ist das zu unübersichtlich.
Mit welchem Editor kriege ich die Datei bearbeitet, bzw wie kann ich sie
besser formatieren?
Wie wäre es mit vim und dem Kommando:

:%s/<\/[^>]*>/&^M/g
(^M wird erzeugt mit Strg-V gefolgt durch Strk-M)

Dann wird nach jedem schließenden Tag ein Zeilenumbruch eingefügt.

Josef
--
These are my personal views and not those of Fujitsu Technology Solutions!
Josef Möllers (Pinguinpfleger bei FTS)
If failure had no penalty success would not be a prize (T. Pratchett)
Company Details: http://de.ts.fujitsu.com/imprint.html
Peter Brenner
2011-07-05 11:13:41 UTC
Post by Wolfgang Klein
ich habe hier eine große (500kB) XML-Datei, in der jedoch kein einziger
Zeilenumbruch vorhanden ist. Ich möchte diese Datei gerne editieren,
aber kate schmiert ab und mit vim ist das zu unübersichtlich.
Mit welchem Editor kriege ich die Datei bearbeitet, bzw wie kann ich sie
besser formatieren?
Mit xmllint kannst Du sie neu formatieren.

xmllint --format DateiName >Neuer Name

HTH
Peter
--
Antworten bitte in die NG. E-Müll Adresse wird nur selten gelesen!
Thomas Kempkes
2011-07-05 11:18:35 UTC
Post by Wolfgang Klein
Hallo,
ich habe hier eine große (500kB) XML-Datei, in der jedoch kein einziger
Zeilenumbruch vorhanden ist. Ich möchte diese Datei gerne editieren,
aber kate schmiert ab und mit vim ist das zu unübersichtlich.
Mit welchem Editor kriege ich die Datei bearbeitet, bzw wie kann ich sie
besser formatieren?
Auf meinem PC auf der Arbeit ist die libxml2 installiert. Die bringt ein
Kommando xmllint mit. Damit kann man auch XML Dateien neu formatieren:

xmllint -format einzeiler.xml > formatiert.xml

Das klappt allerdings nur, wenn die XML Datei "OK" ist.
Post by Wolfgang Klein
Wolfgang Klein
BYe Thomas
--
Alpha Nerd
Heiko Schlenker
2011-07-05 11:25:50 UTC
bzw wie kann ich sie besser formatieren?
tidy -xml -indent datei.xml > datei_neu.xml

Übrigens, die Newsgroup de.comp.text.xml existiert. ;-)

Gruß, Heiko
--
Neu im Usenet? -> http://www.kirchwitz.de/~amk/dni/
Linux-Anfänger(in)? -> http://www.dcoul.de/infos/
Fragen zu KDE/GNOME? -> de.comp.os.unix.apps.{kde,gnome}
Passende Newsgroup gesucht? -> http://groups.google.com/search?as_umsgid=dcoul-***@luv.does-not-exist.org
Wolfgang Klein
2011-07-05 17:11:27 UTC
Danke für alle Lösungsvorschläge!

Xmllint ist genau das, was ich benötige. Ich habe noch nicht viel mit
xml-Dateien gearbeitet, daher kannte ich das Programm nicht. Super
einfach und genau passend. Klasse! :-)


Wolfgang Klein
--
,_,
(o,o) Mit dem Wissen wächst der Zweifel.
{' '} (J.W.v.Goethe)
=#=#= www.NachDenkSeiten.de
Sieghard Schicktanz
2011-07-05 18:13:14 UTC
Hallo Josef,
Post by Josef Moellers
:%s/<\/[^>]*>/&^M/g
(^M wird erzeugt mit Strg-V gefolgt durch Strk-M)
Nicht "^J" (aka "\n")? Carriage Return sind eigentlich unter Unixen
nicht als Zeilenumbruch gängig, das ist was für Mackies.

BTW sollte das fast genauso auch mit sed gehen.
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Josef Moellers
2011-07-06 06:39:06 UTC
Post by Sieghard Schicktanz
Hallo Josef,
Post by Josef Moellers
:%s/<\/[^>]*>/&^M/g
(^M wird erzeugt mit Strg-V gefolgt durch Strk-M)
Nicht "^J" (aka "\n")? Carriage Return sind eigentlich unter Unixen
nicht als Zeilenumbruch gängig, das ist was für Mackies.
Hmmm, ich mach' das schon seit Ewigkeiten so.
Ich hab' das gerade mal ausprobiert: mit ^J werden da NUL-Zeichen eingefügt.
Post by Sieghard Schicktanz
BTW sollte das fast genauso auch mit sed gehen.
Jo.

Die anderen ge-post-eten Lösungen sind aber eigentlich viel eleganter!

Josef
--
These are my personal views and not those of Fujitsu Technology Solutions!
Josef Möllers (Pinguinpfleger bei FTS)
If failure had no penalty success would not be a prize (T. Pratchett)
Company Details: http://de.ts.fujitsu.com/imprint.html
Sieghard Schicktanz
2011-07-06 18:20:47 UTC
Hallo Josef,
Post by Josef Moellers
Post by Sieghard Schicktanz
Post by Josef Moellers
(^M wird erzeugt mit Strg-V gefolgt durch Strk-M)
Nicht "^J" (aka "\n")? Carriage Return sind eigentlich unter Unixen
nicht als Zeilenumbruch gängig, das ist was für Mackies.
Hmmm, ich mach' das schon seit Ewigkeiten so.
Ich hab' das gerade mal ausprobiert: mit ^J werden da NUL-Zeichen eingefügt.
Interessante Interpretation der Steuerzeichen, die der vim da vornimmt.
Finde ich ganz und garnicht sinnvoll. Wenn der jetzt auch bei 'nem "\n"
NULs einbaut, dann solltest Du mal zusehen, daß Du 'nen anständigen Editor
auftreibst - dann ist der wirklich kaputt. (Oder zumindest verkonfiguriert.)
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Thomas Binder
2011-07-06 19:00:02 UTC
Hi,
Post by Sieghard Schicktanz
Interessante Interpretation der Steuerzeichen, die der vim da
vornimmt.
Macht vi ("Version SVR4.0, Solaris 2.5.0") aber genauso (bei ^M),
Insbesondere erscheint bei ^V<Return> auch ^M, sowohl bei vi (wie
oben) und vim.


Ciao

Thomas
Sieghard Schicktanz
2011-07-07 00:13:08 UTC
Hallo Thomas,
Post by Thomas Binder
Macht vi ("Version SVR4.0, Solaris 2.5.0") aber genauso (bei ^M),
Insbesondere erscheint bei ^V<Return> auch ^M, sowohl bei vi (wie
oben) und vim.
_Das_ ist so ja auch korrekt, die Return-Taste liefert ja auch ein Carriage
Return (Code 0x0D, ^M). Nur ist ein solches unter Unixen kein Zeilenende,
das wird da von einem Line Feed (Code 0x0A, ^J) dargestellt - und wenn ein
solches dann als NUL (Code 0x00, ^@) in den Text eingesetzt wird - wer soll
sich denn da noch auskennen?

Naschön, sollen sich die vi-Enthusiasten damit auseinandersetzen, ich
weiß, wie ich bei dem Ding wieder 'rauskomme, und das langt mir im
wesentlichen... ];->
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Thomas Binder
2011-07-07 10:45:04 UTC
Hi,
Post by Sieghard Schicktanz
_Das_ ist so ja auch korrekt, die Return-Taste liefert ja auch
ein Carriage Return (Code 0x0D, ^M). Nur ist ein solches unter
Unixen kein Zeilenende, [...]
Schon richtig, aber da ein <Return> im Editor effektiv ein
Zeilenende erzeugt, finde ich es naheliegend, dass ein per ^V
"gequotetes" <Return> effektiv ein geschütztes solches erzeugt,
das ich in Operationen wie :s verwenden kann.
Post by Sieghard Schicktanz
das wird da von einem Line Feed (Code 0x0A, ^J) dargestellt -
eingesetzt wird - wer soll sich denn da noch auskennen?
Derjenige, der die Doku liest? ;) ^J zu "quoten" funktioniert
übrigens beim Solaris-vi gleich gar nicht, denn ^V^J wirkt dort
wie <Return>.


Ciao

Thomas
Sieghard Schicktanz
2011-07-07 20:13:09 UTC
Hallo Thomas,
Post by Thomas Binder
Schon richtig, aber da ein <Return> im Editor effektiv ein
Zeilenende erzeugt, finde ich es naheliegend, dass ein per ^V
"gequotetes" <Return> effektiv ein geschütztes solches erzeugt,
das ich in Operationen wie :s verwenden kann.
Kann man so sehen - mich hat nur irritiert, daß es zwar als das erzeugte
Zeichen _dargestellt_ wird, aber nicht so _verwendet_.
Post by Thomas Binder
Post by Sieghard Schicktanz
eingesetzt wird - wer soll sich denn da noch auskennen?
Derjenige, der die Doku liest? ;)
Ist doch schon lange "out" ];-> Na, ich verwende die eh nicht...
Post by Thomas Binder
übrigens beim Solaris-vi gleich gar nicht, denn ^V^J wirkt dort
wie <Return>.
Auch interessant...

Naja, Editoren sind schon eigenartige Tierchen. ];->
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Sven Mascheck
2011-07-08 00:58:56 UTC
Post by Josef Moellers
Post by Sieghard Schicktanz
Post by Josef Moellers
(^M wird erzeugt mit Strg-V gefolgt durch Strk-M)
Nicht "^J" (aka "\n")? Carriage Return sind eigentlich unter Unixen
nicht als Zeilenumbruch gängig, das ist was für Mackies.
Hmmm, ich mach' das schon seit Ewigkeiten so.
Ich hab' das gerade mal ausprobiert: mit ^J werden da NUL-Zeichen eingefügt.
Da kommen jetzt einige Dinge zusammen.

Natürlich der (Stream-/)Editor,
aber auch die Terminaleinstellungen (stty),
und mglw. auch die Verbindung, z.B. via ssh, die umsetzt.

Die Ersatzdarstellung mit Dach, z.B. ^J, ist übrigens nur
eine Konvention, die sich aber sehr bewährt und verbreitet hat.
Eine mögliche Erklärung für den Ursprung siehe
http://groups.google.com/group/alt.folklore.computers/msg/9f56bba25ac4b25b

Das gleiche gilt für die Möglichkeit, die nicht druckbaren
ASCII-Zeichen mit ctrl-... einzugeben.
Kurz: man verknüpft dabei das Zeichen über XOR mit 0x40.
Wenn man das geschickt aufmalt, erkennt man das System dahinter:
Man gehe in der Tabelle [1] vom fraglichen Zeichen an die entsprechende
Stelle im obersten Block, z.B. ^H -> ASCII-BS (backspace).

Die Möglichkeit, ein Zeichen mit ^V geschützt einzugeben, wird dabei
meistens vom terminal driver zur Verfügung gestellt (stty -a: lnext).
Wenn der das ^V nicht selbst verwertet oder nicht kennt, können aber
auch Programme (z.B. Shells) entsprechend darauf reagieren.

^M und Enter (ASCII-CR) werden von Terminals üblicherweise gleichwertig
behandelt, um ein newline zu erzeugen (ASCII-NL).

^J führt speziell im vim auch bei mir (und nur vim) zu einem ASCII-NUL.
Ich verstehe den Sinn nicht, denn es gibt eine viel näherliegende,
allgemeine Möglichkeit, ASCII-NUL einzugeben, nämlich <ctrl-space>.
<ctrl-j> hingegen ist die übliche Methode, um ASCII-NL einzugeben.
Der traditionelle vi (wie der auf SunOS5 genannte) tut das nicht.
Falls doch (siehe thread), würde ich von einem Irrtum o.ä. ausgehen.

Um Editor und auch die Shell im Eingabemodus (die dann dazwischenfunkt)
mal beiseite zu legen: Es wird - auf dem jeweiligen System - vielleicht
schon klarer, wenn man sich das mit od ansieht,

$ od -c
<ctrl-v><ctrl-enter>
<ctrl-d>

bzw. mit diesen
<ctrl-v><ctrl-m>
<ctrl-v><ctrl-j>
<ctrl-v><ctrl-space>

Das erzeugt bei mir (gerade Win->putt->linux) :
\r \n
\r \n
\n \n
\0 \n

und entspricht soweit dem obigen.

[1]
| 0 NUL| 1 SOH| 2 STX| 3 ETX| 4 EOT| 5 ENQ| 6 ACK| 7 BEL|
| 8 BS | 9 HT | 10 NL | 11 VT | 12 NP | 13 CR | 14 SO | 15 SI |
| 16 DLE| 17 DC1| 18 DC2| 19 DC3| 20 DC4| 21 NAK| 22 SYN| 23 ETB|
| 24 CAN| 25 EM | 26 SUB| 27 ESC| 28 FS | 29 GS | 30 RS | 31 US |
===============================================================
| 32 SP | 33 ! | 34 " | 35 # | 36 $ | 37 % | 38 & | 39 ' |
| 40 ( | 41 ) | 42 * | 43 + | 44 , | 45 - | 46 . | 47 / |
| 48 0 | 49 1 | 50 2 | 51 3 | 52 4 | 53 5 | 54 6 | 55 7 |
| 56 8 | 57 9 | 58 : | 59 ; | 60 < | 61 = | 62 > | 63 ? |
---------------------------------------------------------------
| 64 @ | 65 A | 66 B | 67 C | 68 D | 69 E | 70 F | 71 G |
| 72 H | 73 I | 74 J | 75 K | 76 L | 77 M | 78 N | 79 O |
| 80 P | 81 Q | 82 R | 83 S | 84 T | 85 U | 86 V | 87 W |
| 88 X | 89 Y | 90 Z | 91 [ | 92 \ | 93 ] | 94 ^ | 95 _ |
--
http://www.in-ulm.de/~mascheck/various/ascii-tty/
http://www.in-ulm.de/~mascheck/various/stty/
Christian Neukirchen
2011-07-08 11:11:10 UTC
Post by Sven Mascheck
^J führt speziell im vim auch bei mir (und nur vim) zu einem ASCII-NUL.
Ich verstehe den Sinn nicht, denn es gibt eine viel näherliegende,
allgemeine Möglichkeit, ASCII-NUL einzugeben, nämlich <ctrl-space>.
Das liegt daran, dass ^V eigentlich Zahlen lesen will, und du die
Eingabe gleich beendest. Vgl "^V65^J" -> "A".
Post by Sven Mascheck
CTRL-V Insert next non-digit literally. For special keys, the
terminal code is inserted. It's also possible to enter the
decimal, octal or hexadecimal value of a character
i_CTRL-V_digit.
The characters typed right after CTRL-V are not considered for
mapping. {Vi: no decimal byte entry}
...
Post by Sven Mascheck
With CTRL-V the decimal, octal or hexadecimal value of a character can be
entered directly. This way you can enter any character, except a line break
(<NL>, value 10).
...
Post by Sven Mascheck
If you enter a value of 10, it will end up in the file as a 0. The 10 is a
<NL>, which is used internally to represent the <Nul> character. When writing
the buffer to a file, the <NL> character is translated into <Nul>. The <NL>
character is written at the end of each line. Thus if you want to insert a
<NL> character in a file you will have to make a line break.
Eklig. :)
--
Christian Neukirchen <***@gmail.com> http://chneukirchen.org
Sven Mascheck
2011-07-08 22:20:47 UTC
Post by Christian Neukirchen
Post by Sven Mascheck
^J führt speziell im vim auch bei mir (und nur vim) zu einem ASCII-NUL.
Ich verstehe den Sinn nicht, denn es gibt eine viel näherliegende,
allgemeine Möglichkeit, ASCII-NUL einzugeben, nämlich <ctrl-space>.
Das liegt daran, dass ^V eigentlich Zahlen lesen will, und du die
Eingabe gleich beendest. Vgl "^V65^J" -> "A".
Das wohl nicht, denn andere nicht druckbare, per ctrl- erzeugte Zeichen
werden ja akzeptiert,
Post by Christian Neukirchen
Post by Sven Mascheck
If you enter a value of 10, it will end up in the file as a 0.
The 10 is a <NL>, which is used internally to represent the <Nul>
character. When writing the buffer to a file, the <NL> character
is translated into <Nul>. The <NL> character is written at the
end of each line. Thus if you want to insert a <NL> character in
a file you will have to make a line break.
aber das erklärt es letztendlich (das ASCII-NL wird "abgefangen", egal auf
welchem Wege es erzeugt wird), Danke.
Josef Moellers
2011-07-11 07:06:58 UTC
Post by Christian Neukirchen
Post by Sven Mascheck
^J führt speziell im vim auch bei mir (und nur vim) zu einem ASCII-NUL.
Ich verstehe den Sinn nicht, denn es gibt eine viel näherliegende,
allgemeine Möglichkeit, ASCII-NUL einzugeben, nämlich <ctrl-space>.
Das liegt daran, dass ^V eigentlich Zahlen lesen will, und du die
Eingabe gleich beendest. Vgl "^V65^J" -> "A".
Interessant ... man lernt nie aus! Danke!
Post by Christian Neukirchen
Post by Sven Mascheck
CTRL-V Insert next non-digit literally. For special keys, the
terminal code is inserted. It's also possible to enter the
decimal, octal or hexadecimal value of a character
i_CTRL-V_digit.
The characters typed right after CTRL-V are not considered for
mapping. {Vi: no decimal byte entry}
NB Beim Ersetzen geht das mit dem ^J nicht (also ^V-65^J), denn das
ersetzt sofort. Man kann aber nach der Zahl einen
nicht-Ziffern-Buchstaben eingeben, muß den dann aber wieder löschen:
:s/A/^V66x<BS>noch mehr Text/
ersetzt das "A" durch "Bnoch mehr Text".
Post by Christian Neukirchen
...
Post by Sven Mascheck
With CTRL-V the decimal, octal or hexadecimal value of a character can be
entered directly. This way you can enter any character, except a line break
(<NL>, value 10).
...
Post by Sven Mascheck
If you enter a value of 10, it will end up in the file as a 0. The 10 is a
<NL>, which is used internally to represent the <Nul> character. When writing
the buffer to a file, the <NL> character is translated into <Nul>. The <NL>
character is written at the end of each line. Thus if you want to insert a
<NL> character in a file you will have to make a line break.
Eklig. :)
Ziemlich!

Trotzdem: wieder was gelernt!

Josef
--
These are my personal views and not those of Fujitsu Technology Solutions!
Josef Möllers (Pinguinpfleger bei FTS)
If failure had no penalty success would not be a prize (T. Pratchett)
Company Details: http://de.ts.fujitsu.com/imprint.html