¿Cómo manipular XML desde la línea de comandos en el script de shell?
Hay muchos comandos para manipular datos tabulares, sustituir variables de entorno o reemplazar fragmentos de texto con expresiones regulares, pero no he encontrado nada para XML.
Mi script de compilación necesita insertar una etiqueta con contenido dentro de la etiqueta principal del documento xml, y me resulta excesivo instalar java, perl o python en el sistema operativo para ese propósito (mis scripts se realizan en gitlab con imágenes de acoplador, por lo que mi trabajo con herramientas disponibles en maven: la imagen 3.5-jdk-8 sería un sueño).
No quiero manipular XML con sed, aunque en mi script de compilación funcionaría, porque es malo .
Ejemplo: tengo el siguiente 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>
Y quiero insertar el siguiente bloque:
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
dentro de la etiqueta del proyecto (y no importa si estará al principio o al final).
fuente
maven
: sospecho que hay una mejor manera de hacer lo que estás tratando de hacer dentro de Maven.Respuestas:
XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) está escrito en C y usa
libxml2
ylibxslt
.Dado el documento XML
root
se puede insertar un subnodo enque produce
Insertar muchas cosas (usando el original
file.xml
en la parte superior aquí):Esto produce
Para el ejemplo en la pregunta:
Resultado:
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 nuevodistributinManagement
nodo están dentronew.xml
(pero no la etiqueta del nodo en sí), se podría hacer lo siguiente para insertarnew.xml
en el nodo raíz:XMLStarlet escapará automáticamente de los datos que necesitan escapar, como los caracteres
<
y>
. Elxml unesc
bit desempaqueta los datos insertados (en realidad desempaqueta todo el documento, lo que puede o no ser un problema) yxml fo
reformatea el documento XML resultante.El resultado es
Me inquieta un poco hacerlo de esta manera, "pero funciona".
Consulte también esta pregunta relacionada sobre StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt
fuente
probablemente todavía sea excesivo, pero si solo le preocupa el tamaño del contenedor, podría usar un lenguaje muy liviano como Lua o Guile.
de los documentos de Lua:
fuente