PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeile in XML Datei ersetzen



f1b
14-06-2007, 14:06
Hallo,

ich muss in einer XML Datei eine Zeile ersetzen. Das Problem dabei ist, dass ja die Struktur der Datei erhalten bleiben muss. Wenn ich sie zeilenweise auslese, ersetze und wieder schreibe sind ja die Leerzeichen in der Datei weg. Hat hierzu jemand einen Tip für mich ?

Danke und Grüße
F1B

undefined
14-06-2007, 16:04
Scriptsprachen Shell, Cgi, Perl, Python, Ruby, ASP, usw.
Und um welche Sprache handelt es sich denn mit der du Arbeitest - sonst nehme den Editor :rolleyes:

f1b
15-06-2007, 07:12
Hallo,

leider hab ich nur eine LINUX shell. Und natürlich soll das Ganze mit einem skript automatisch erledigt werden ;-). Perl ging auch aber davon hab ich leider keine Ahnung. Sorry für die wenigen Informationen, war gestern in Eile.

Es geht darum in einem XML eine Zeile zu ersetzen ohne die "Position" zu verlieren:

"8 Leerzeichen"<InternalIDNumber>RED02</InternalIDNumber>

soll durch

"8 Leerzeichen"<InternalIDNumber>625423</InternalIDNumber>

ersetzt werden. Leider taucht RED02 noch in anderen Zeilen auf und es soll nur in dieser einen Zeile ersetzt werden. Wie gesagt müssen die Leerzeichen an Anfang der Zeile erhalten bleiben.

Grüße

f1B

jan61
16-06-2007, 22:56
...Wenn ich sie zeilenweise auslese, ersetze und wieder schreibe sind ja die Leerzeichen in der Datei weg....

Bei Einsatz von read & Co. in der Shell sind die Leerzeichen weg, aber für die Zeichenkettenbearbeitung gibt es ja ein paar Spezialisten.

Bsp. awk:
jan@jack:~/tmp> cat tst.txt
<InternalIDNumber>RED02</InternalIDNumber>
<InternalXDNumber>RED02</InternaXDNumber>
jan@jack:~/tmp> awk ' /^ <InternalIDNumber>RED02<\/InternalIDNumber>$/ { print gensub(/(.+)RED02(.+)/, "\\1625423\\2", 1); getline; } { print; } ' tst.txt
<InternalIDNumber>625423</InternalIDNumber>
<InternalXDNumber>RED02</InternaXDNumber>
Bsp. sed:

jan@jack:~/tmp> sed 's/^\( <InternalIDNumber>\)RED02\(<\/InternalIDNumber>\)$/\1625423\2/' tst.txt
<InternalIDNumber>625423</InternalIDNumber>
<InternalXDNumber>RED02</InternaXDNumber>
Bsp. perl:

jan@jack:~/tmp> cat tst.txt | perl -pn -e ' s/(^ <InternalIDNumber>)RED02(<\/InternalIDNumber>)$/${1}625423$2/; '
<InternalIDNumber>625423</InternalIDNumber>
<InternalXDNumber>RED02</InternaXDNumber>
Jan

P.S.: Du zerstörst übrigens mitnichten die Struktur der XML-Datei, wenn Leerzeichen außerhalb von Tags entfallen - Du machst die Datei nur für menschliche Augen weniger gut lesbar. Einem XML-Parser sind diese Leerzeichen genauso wie Zeilenumbrüche völlig wurscht. Das gilt übrigens auch für Leerzeichen und Zeilenumbrüche in den Tag-Inhalten - wenn man die braucht, dann muss man eine CDATA-Sektion einbauen.