staging.inyokaproject.org

Zeile in xml-Konfigdatei einfügen

Status: Gelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Um die Vagamule-Konfigurationsdatei einfach in einen funktionsfähigen Zustand zu versetzen, muss eine Zeile eingefügt werden, die leider mit dem Patch nicht mehr erstellt wird.

In ~/.vagalume/config.xml fehlt nach der Zeile

  <overwrite>0</overwrite>

der Eintrag

  <ownb>1</ownb>

Wie könnte ich den mit einem Kommandozeilen-Befehl dort hinbekommen?

so long
hank

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Das solltest Du mit xmlstarlet hinbekommen ☺

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

1
sed "/<overwrite>0<\/overwrite>/a<ownb>1</ownb>"  ~/.vagalume/config.xml
  • /.../ umfasst das zu findende Pattern, hier einfach der Text, wobei das / maskiert werden muss, um nicht für den Abschluss gehalten zu werden.

  • a ist append

  • danach das, was anzuhängen ist.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Man kann natürlich mit sed und Konsorten vorgehen - allerdings bist Du mit einem spezialisierten Werkzeug auf der sicheren Seite.

Hier wäre der Befehlsaufruf mit xmlstarlet:

1
xmlstarlet ed -a "//overwrite" -t elem -n "ownb" -v 1 file.xml

Ggf. musst Du den XPath-Ausdruck noch anpassen.

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

@ user unknown

So hatte ich mir das ja auch vorgestellt; leider passiert damit aber gar nichts... (Wie) Müssten denn die Leerzeichen vor <overwrite>0<\/overwrite> behandelt werden?

@ Lysander Da http://xmlstar.sourceforge.net/doc/UG/ch04s03.html steht es vielleicht - allein, ich find es nicht 😉

so long
hank

EDIT Lysanders Befehl hat mir im Terminal auch brav das gewünschte Resultat ausgegeben; nur hab' ich dann (Beim versuch es wieder beim nächsten Aufruf umzulenken? oder schon beim ersten Aufruf?) die Datei "geleert", es steht also nix mehr drin...

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Heinrich Schwietering schrieb:

In ~/.vagalume/config.xml fehlt nach der Zeile

Nein, nicht nach der Zeile, sondern nach dem Tag !

Es geht da um XML, und da sind Zeilen Schall und Rauch ...

Das was Lysander vorschlägt, ist in der Tat der bequemste Weg, sowas fachgerecht zu erledigen.

Wenn Du selber etwas anpassen willst, gibt es eine schöne Übersicht, wie man den Suchterm formulieren kann:
http://zvon.org/xxl/XPathTutorial/Output_ger/example1.html und folgende. (die Xpath-Ausdrücke gelten für alle XML-Tools, also auch für xmlstarlet !)

Edit:

(Wie) Müssten denn die Leerzeichen vor <overwrite>0<\/overwrite> behandelt werden?

Gar nicht, das ist doch gerade der Vorteil ! - (es geht ja nur nach den Tags)

Wieso funktioniert das Ding von Lysander nicht ?? - :

track@lucid:~$ echo '<xml> <overwrite>0</overwrite> </xml>'  |  xmlstarlet ed -a "//overwrite" -t elem -n "ownb" -v 1
<?xml version="1.0"?>
<xml>
  <overwrite>0</overwrite>
  <ownb>1</ownb>
</xml> 

Kannst Du im Zweifel mal bitte eine Original-Musterdatei posten ?

track

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Es funktioniert ja...

xmlstarlet ed -a "//overwrite" -t elem -n "ownb" -v 1 config.xml  

gibt mir im Terminal genau das aus, was ich haben wollte; die Ausgabe wollte ich mit angehängtem > /home/heinrich/.vagalume/config.xml wieder in die Datei leiten; das klappte aber nicht, danach war die Datei leer, im Terminal nur ein Fehlermeldung.

config.xml:1: parser error : Document is empty

^
config.xml:1: parser error : Start tag expected, '<' not found

^

In eine andere Datei ging es allerdings schon. Gibts da auch so etwas wie eine -i-Option wie bei sed, damit das Ergebnis gleich wieder in die Ursprungsdatei eingefügt wird?

so long
hank

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Heinrich Schwietering schrieb:

In eine andere Datei ging es allerdings schon. Gibts da auch so etwas wie eine -i-Option wie bei sed, damit das Ergebnis gleich wieder in die Ursprungsdatei eingefügt wird?

Musst Du eben mal in der Doku suchen 😉

Ich finds übrigens cool, dass das Kommando von mir - ohne es getestet zu haben - direkt funktioniert hat 😀

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

OK, -L, oder --inplace passen 😉

Thanks!

so long
hank

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

Heinrich Schwietering schrieb:

Hi!

@ user unknown

So hatte ich mir das ja auch vorgestellt; leider passiert damit aber gar nichts... (Wie) Müssten denn die Leerzeichen vor <overwrite>0<\/overwrite> behandelt werden?

Das Kommando alleine würde nur die veränderte Datei ausgeben. Um die Datei 'in place' zu ändern benötigt man den -i -Schalter:

1
sed -i "/<overwrite>0<\/overwrite>/a<ownb>1</ownb>"  ~/.vagalume/config.xml

Sed sucht nach dem Ausdruck in einer Zeile, ohne dass der Ausdruck die ganze Zeile treffen müßte - das würde man - wenn man wollte - mit ^ und $ für Zeilenanfang/-ende ausdrücken:

1
sed -i "/^<overwrite>0<\/overwrite>$/a<ownb>1</ownb>"  ~/.vagalume/config.xml

aber das willst Du ja gerade nicht.

xmlstarlet spielt seine Vorteile insbesondere dann aus, wenn der Ausdruck nicht in einer Zeile auftaucht, oder andere, optionale Elemente enthielt:

1
2
3
4
5
6
7
8
9
/<overwrite>0
<\/overwrite>

/<overwrite>0<\/overwrite>
/<overwrite> 0<\/overwrite>
/<overwrite>0 <\/overwrite>
/<overwrite> 0 <\/overwrite>

/<overwrite chakatu="flop, flip, zimkatu">0<\/overwrite>

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

@ user unknown

Ja, das mit dem -i-Schalter hatte ich schon so gemacht; trotzdem passierte gar nichts, muss wohl noch irgendwas anderes falsch gelaufen sein 😐 .

Mit

sed -i "/<overwrite>0<\/overwrite>/a\ \ <ownb>1</ownb>"  ~/.vagalume/config.xml

geht es jetzt auch, auch die beiden Leerzeichen am Anfang werden wieder eingefügt, so das es wieder perfekt aussieht. Das ist die einfachere Version, um es im Wiki aufzunehmen, weil xmlstarlet ja erst installiert werden müsste.

thx! 👍

so long
hank

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Heinrich Schwietering schrieb:

Das ist die einfachere Version, um es im Wiki aufzunehmen, weil xmlstarlet ja erst installiert werden müsste.

Es ist aber vor allem eine gefährliche - rekursives Markup parsen kann man nicht zuverlässig mit sed. Punkt. Aber das hatten wir hier schon zig mal...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

Lysander schrieb:

Es ist aber vor allem eine gefährliche - rekursives Markup parsen kann man nicht zuverlässig mit sed. Punkt. Aber das hatten wir hier schon zig mal...

Wenn die XML-Datei von einem Programm erzeugt wird, dann doch wohl immer wieder auf die gleiche Weise.

Erst wenn unterschiedliche Programme das XML verarbeiten, und andere die Freiheiten von XML für ein anderes Format, also sowas wie oben beschriebenes, verwenden, mit zusätzlichen Blanks z.B., wird der sed-Ansatz scheitern.

Danach sieht es hier aber nicht aus. Eine neue Programmversion könnte das Format ändern, aber kann das Format in jede andere Richtung auch ändern, auch in Richtungen, bei denen xmlstarlet auch scheitert.

Punkt.

Punkt, basta, helau! 😉

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Die config.xml-Datei wird automatisch neu angelegt, wenn man sie löscht... Vermutlich ist das Risiko von "unzuverlässigem rekursiven Markup Parsen" (was immer es genau bedeuten mag 😉) - hoffentlich - nicht allzu groß... Ich habe aber im Vagamule-Artikel nochmal hierher verlinkt, als mögliche Alternativ-Lösung kann man dann auch die xmlstarlet-Methode wählen.

so long
hank

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

user unknown schrieb:

Wenn die XML-Datei von einem Programm erzeugt wird, dann doch wohl immer wieder auf die gleiche Weise.

Das ist sicherlich nicht garantiert.

Erst wenn unterschiedliche Programme das XML verarbeiten, und andere die Freiheiten von XML für ein anderes Format, also sowas wie oben beschriebenes, verwenden, mit zusätzlichen Blanks z.B., wird der sed-Ansatz scheitern.

In solch einem Szenario ist das Risiko sicherlich noch größer, ja.

aber kann das Format in jede andere Richtung auch ändern, auch in Richtungen, bei denen xmlstarlet auch scheitert.

Wenn sich das Schema ändert muss man den Ausdruck ggf. anpassen, das stimmt wohl.

Punkt, basta, helau! 😉

Alaaf? 😉

@Heinrich Schwietering Ich würde stets das idiomatisch richtige Werkzeug benutzen. Es mag mehr Aufwand beim Installieren machen, dafür hat man einfach weniger Ärger.

Antworten |