XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) está escrito en C y usa libxml2
y libxslt
.
Dado el documento XML
<?xml version="1.0"?>
<root>
<tag>data</tag>
</root>
root
se 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.xml
en 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.xml
y los bits adicionales que deberían ir en el nuevo distributinManagement
nodo están dentro new.xml
(pero no la etiqueta del nodo en sí), se podría hacer lo siguiente para insertar new.xml
en 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 unesc
bit desempaqueta los datos insertados (en realidad desempaqueta todo el documento, lo que puede o no ser un problema) y xml fo
reformatea 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