XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) está escrito en C y usa libxml2y libxslt.
Dado el documento XML
<?xml version="1.0"?>
<root>
<tag>data</tag>
</root>
rootse puede insertar un subnodo en
xml ed -s '/root' -t elem -n 'newtag' -v 'newdata' file.xml
que produce
<?xml version="1.0"?>
<root>
<tag>data</tag>
<newtag>newdata</newtag>
</root>
Insertar muchas cosas (usando el original file.xmlen la parte superior aquí):
xml ed -s '/root' -t elem -n 'newtag' \
-s '/root/newtag' -t elem -n 'subtag' -v 'subdata' file.xml
Esto produce
<?xml version="1.0"?>
<root>
<tag>data</tag>
<newtag>
<subtag>subdata</subtag>
</newtag>
</root>
Para el ejemplo en la pregunta:
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
Resultado:
<?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>
Insertar un archivo XML previamente preparado en una ubicación en el XML:
Suponiendo que el XML original de la pregunta está dentro file.xmly los bits adicionales que deberían ir en el nuevo distributinManagementnodo están dentro new.xml(pero no la etiqueta del nodo en sí), se podría hacer lo siguiente para insertar new.xmlen el nodo raíz:
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 escapará automáticamente de los datos que necesitan escapar, como los caracteres <y >. El xml unescbit desempaqueta los datos insertados (en realidad desempaqueta todo el documento, lo que puede o no ser un problema) y xml foreformatea el documento XML resultante.
El resultado es
<?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>
Me inquieta un poco hacerlo de esta manera, "pero funciona".
Consulte también esta pregunta relacionada sobre StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt