XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) ist in C geschrieben und verwendet libxml2
und libxslt
.
Angesichts des XML-Dokuments
<?xml version="1.0"?>
<root>
<tag>data</tag>
</root>
Ein Unterknoten root
kann mit eingefügt werden
xml ed -s '/root' -t elem -n 'newtag' -v 'newdata' file.xml
was produziert
<?xml version="1.0"?>
<root>
<tag>data</tag>
<newtag>newdata</newtag>
</root>
Viele Dinge einfügen (hier das Original file.xml
oben verwenden):
xml ed -s '/root' -t elem -n 'newtag' \
-s '/root/newtag' -t elem -n 'subtag' -v 'subdata' file.xml
Dies erzeugt
<?xml version="1.0"?>
<root>
<tag>data</tag>
<newtag>
<subtag>subdata</subtag>
</newtag>
</root>
Für das Beispiel in der Frage:
xml ed -N x="http://maven.apache.org/POM/4.0.0" \
-s '/x:project' -t elem -n 'distributionManagement' \
-s '/x:project/distributionManagement' -t elem -n 'repository' \
-s '/x:project/distributionManagement/repository' -t elem -n 'id' \
-v 'private-releases' \
-s '/x:project/distributionManagement/repository' -t elem -n 'url' \
-v 'https://my.private.server.com/nexus/repository/maven-releases/' \
file.xml
Ergebnis:
<?xml version="1.0"?>
<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-->
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
</project>
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 neuen distributinManagement
Knoten eingefügt werden sollen, sind in new.xml
(aber nicht das Knoten-Tag selbst), könnte man Folgendes tun , um es new.xml
in den Wurzelknoten einzufügen :
xml ed -N x="http://maven.apache.org/POM/4.0.0" \
-s '/x:project' -t elem -n 'distributionManagement' \
-v "$(<new.xml)" file.xml | xml unesc | xml fo
XMLStarlet maskiert automatisch Daten, die maskiert werden müssen, wie z. B. <
und >
Zeichen. Das xml unesc
Bit entkoppelt die eingefügten Daten (es entkapselt tatsächlich das gesamte Dokument, was möglicherweise ein Problem darstellt oder nicht) und xml fo
formatiert das resultierende XML-Dokument neu.
Das Ergebnis ist
<?xml version="1.0"?>
<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-->
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
</project>
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