sed in xml datei

M

mondo

Grünschnabel
Hallo,

ich habe ein solches XML-Muster:
Code:
 cat config.xml 
<server target=instance1>
    <serrverpanel>
	bla 
    </serverpanel>
    <serverinstance>
	bla
    </serverinstance>
	<service name=test1>
		blubb
	</service>
	<service name=test2>
		blubb
	</service>
	<service name=test3>
		blubb
	</service>
</server>
<server target=instance2>
    <serrverpanel>
	bla 
    </serverpanel>
    <serverinstance>
	bla
    </serverinstance>
	<service name=test1>
		blubb
	</service>
	<service name=test2>
		blubb
	</service>
	<service name=test3>
		blubb
	</service>
</server>
<server target=instance3>
    <serrverpanel>
	bla 
    </serverpanel>
    <serverinstance>
	bla
    </serverinstance>
	<service name=test1>
		blubb
	</service>
	<service name=test2>
		blubb
	</service>
	<service name=test3>
		blubb
	</service>
</server>

Ich möchte nun ein solches "serrvice-chapter" einfügen und zwar abhängig vom target name im serrver.
Zum Beispiel soll in instance2 dies hier rein:
Code:
	<service name=test4>
		ich bin neu
	</service>

Ob unten oder oben ist egal. Das ganze versuche ich unter Unix.

Vielen Dank!
 
1. Das oben ist kein xml
Das hier ist xml:
Code:
cat config.xml
<?xml version="1.0" encoding="UTF-8"?>
<serverpark>
<server target='instance1'>
   <serverpanel>bla</serverpanel>
   <serverinstance>bla</serverinstance>
   <service name="test1">blubb</service>
   <service name="test2">blubb</service>
   <service name="test3">blubb</service>
</server>
<server target='instance2'>
   <serverpanel>bla</serverpanel>
   <serverinstance>bla</serverinstance>
   <service name="test1">blubb</service>
   <service name="test2">blubb</service>
   <service name="test3">blubb</service>
</server>
<server target='instance3'>
   <serverpanel>bla</serverpanel>
   <serverinstance>bla</serverinstance>
   <service name="test1">blubb</service>
   <service name="test2">blubb</service>
   <service name="test3">blubb</service>
</server>
</serverpark>


2. Nimmt dafür einen xmlparser einer entspr. Lib/Klasse von diversen Scriptsprachen. Als Kommandozeilentool nimmt man z.B. xmlstarlet, das kann nicht nur abfragen wie die meisten Wrapper dieser Libs sondern auch Änderungen:
Code:
xmlstarlet ed -s "//server[@target='instance2']"  -t elem -n "service" -v "ich bin neu" \
              -i "//server[@target='instance2']/node()[last()]" -t attr -n name -v "test4" ./config.xml

das liefert dann:
Code:
...
<server target="instance2">
    <serverpanel>bla</serverpanel>
    <serverinstance>bla</serverinstance>
    <service name="test1">blubb</service>
    <service name="test2">blubb</service>
    <service name="test3">blubb</service>
    <service name="test4">ich bin neu</service>
  </server>
...

Musste halt noch die Ausgabe umleiten in ein neues File....
 
Code:
sed -i '/<server target=instance2>/,/<\/server>/{s/<\/server>/\t<service name=test4>\n\t\tich bin neu\n\t<\/service>\n&/}' config.xml
 
Wieso verschwindet hier immer meine Antwort?
 
Ach du liebe Güte, da falle ich auf einen Leichenschänder rein, der den Thread nach oben gepusht hat. :O
 

Ähnliche Themen

E-Mail Empfang, Aliases unter Debian Squeeze

Text an Datei (xml) anfügen mit awk, sed, perl oder Ähnlichem...

smb.conf: Userauth für Home Folders und kein Auth für Public Folders möglich?

SUSe Block Port

Anleitung: Howto: OpenSUSE 10, XDMCP und Cygwin als Thin-Client

Zurück
Oben