¿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
libxml2ylibxslt.Dado el documento XML
rootse puede insertar un subnodo enque produce
Insertar muchas cosas (usando el original
file.xmlen 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.xmly los bits adicionales que deberían ir en el nuevodistributinManagementnodo están dentronew.xml(pero no la etiqueta del nodo en sí), se podría hacer lo siguiente para insertarnew.xmlen el nodo raíz:XMLStarlet escapará automáticamente de los datos que necesitan escapar, como los caracteres
<y>. Elxml unescbit desempaqueta los datos insertados (en realidad desempaqueta todo el documento, lo que puede o no ser un problema) yxml foreformatea 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