Wie manipuliere ich XML über die Befehlszeile im Shell-Skript?
Es gibt viele Befehle zum Bearbeiten von Tabellendaten, zum Ersetzen von Umgebungsvariablen oder zum Ersetzen von Textfragmenten durch Regex, aber ich habe nichts für XML gefunden.
Mein Build-Skript muss ein Tag mit Inhalt in das Haupt-Tag des XML-Dokuments einfügen, und ich finde es ein Overkill, zu diesem Zweck Java, Perl oder Python in OS zu installieren (meine Skripte werden in gitlab mit Docker-Images erstellt Mein Job mit Tools, die in Maven verfügbar sind: 3.5-JDK-8-Bild wäre ein Traum.
Ich möchte XML nicht mit sed manipulieren, obwohl es in meinem Build-Skript funktionieren würde, weil es böse ist .
Beispiel: Ich habe die folgende XML:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- a lot of other tags-->
</project>
Und ich möchte folgenden Block einfügen:
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
innerhalb des Projekt-Tags (und es spielt keine Rolle, ob es am Anfang oder am Ende sein wird.
quelle
maven
- ich vermute, es gibt einen besseren Weg, um das zu tun, was Sie in Maven selbst versuchen.Antworten:
XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) ist in C geschrieben und verwendet
libxml2
undlibxslt
.Angesichts des XML-Dokuments
Ein Unterknoten
root
kann mit eingefügt werdenwas produziert
Viele Dinge einfügen (hier das Original
file.xml
oben verwenden):Dies erzeugt
Für das Beispiel in der Frage:
Ergebnis:
Einfügen einer zuvor vorbereiteten XML-Datei an einer Stelle im XML:
Angenommen, das ursprüngliche XML aus der Frage ist in
file.xml
und die zusätzlichen Bits, die in den neuendistributinManagement
Knoten eingefügt werden sollen, sind innew.xml
(aber nicht das Knoten-Tag selbst), könnte man Folgendes tun , um esnew.xml
in den Wurzelknoten einzufügen :XMLStarlet maskiert automatisch Daten, die maskiert werden müssen, wie z. B.
<
und>
Zeichen. Dasxml unesc
Bit entkoppelt die eingefügten Daten (es entkapselt tatsächlich das gesamte Dokument, was möglicherweise ein Problem darstellt oder nicht) undxml fo
formatiert das resultierende XML-Dokument neu.Das Ergebnis ist
Ich bin ein bisschen unruhig, wenn ich es so mache, "aber es funktioniert".
Siehe auch diese verwandte Frage zu StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt
quelle
Es ist wahrscheinlich immer noch übertrieben, aber wenn Sie sich nur mit der Größe des Containers befassen, können Sie eine sehr leichte Sprache wie Lua oder Guile verwenden.
aus den Lua-Dokumenten:
quelle