Comment manipuler XML à partir de la ligne de commande dans un script shell?
Il existe de nombreuses commandes pour manipuler les données tabulaires, remplacer la variable d'environnement ou remplacer les fragments de texte par regex, mais je n'ai rien trouvé pour XML.
Mon script de construction doit insérer une balise avec du contenu dans la balise principale du document xml, et je trouve cela exagéré d'installer java, perl ou python dans le système d'exploitation à cet effet (mes scripts sont effectués dans gitlab avec des images de docker, ce faisant mon travail avec les outils disponibles dans maven: l'image 3,5-jdk-8 serait un rêve).
Je ne veux pas manipuler XML avec sed, bien que dans mon script de construction cela fonctionnerait, car c'est mal .
Exemple: j'ai le xml suivant:
<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>
Et je veux insérer le bloc suivant:
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
à l'intérieur de la balise de projet (et cela n'a pas vraiment d'importance si ce sera au début ou à la fin.
la source
maven
- je pense qu'il y a une meilleure façon de faire ce que vous essayez de faire au sein de Maven lui-même.Réponses:
XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) est écrit en C et utilise
libxml2
etlibxslt
.Étant donné le document XML
un sous-noeud à
root
peut être inséré à l'aidequi produit
Insérer beaucoup de choses (en utilisant l'original
file.xml
en haut ici):Cela produit
Pour l'exemple de la question:
Résultat:
Insertion d'un fichier XML préalablement préparé à un emplacement dans le XML:
En supposant que le XML d'origine de la question est dans
file.xml
et que les bits supplémentaires qui devraient aller dans le nouveaudistributinManagement
nœud sont dedansnew.xml
(mais pas la balise de nœud elle-même), on pourrait faire ce qui suit pour insérernew.xml
dans le nœud racine:XMLStarlet échappera automatiquement les données à échapper, telles que les caractères
<
et>
. Lexml unesc
bit échappe les données insérées (il échappe en fait tout le document, ce qui peut ou non être un problème), etxml fo
reformate le document XML résultant.Le résultat est
Je suis un peu mal à l'aise de le faire de cette façon, "mais cela fonctionne".
Voir également cette question connexe sur StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt
la source
c'est probablement encore exagéré, mais si vous ne vous souciez que de la taille du conteneur, vous pouvez utiliser un langage très léger tel que Lua ou Guile.
des documents Lua:
la source