Como manipular XML da linha de comando no shell script?
Existem muitos comandos para manipular dados tabulares, substituir variáveis de ambiente ou substituir fragmentos de texto por regex, mas não encontrei nada para XML.
Meu script de construção precisa inserir uma tag com conteúdo na tag principal do documento xml, e considero um exagero instalar java, perl ou python no SO para esse fim (meus scripts são feitos no gitlab com imagens do docker, fazendo isso meu trabalho com as ferramentas disponíveis no maven: a imagem 3.5-jdk-8 seria um sonho).
Eu não quero manipular XML com sed, embora no meu script de construção funcionasse, porque é ruim .
Exemplo: Eu tenho o seguinte 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>
E eu quero inserir o seguinte bloco:
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
dentro da tag do projeto (e não importa se será no início ou no final).
fonte
maven
- suspeito que haja uma maneira melhor de fazer o que você está tentando fazer no próprio Maven.Respostas:
O XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) está escrito em C e usa
libxml2
elibxslt
.Dado o documento XML
um subnó
root
pode ser inserido usandoque produz
Inserindo muitas coisas (usando o original
file.xml
na parte superior aqui):Isso produz
Para o exemplo na pergunta:
Resultado:
Inserindo um arquivo XML preparado anteriormente em um local no XML:
Supondo que o XML original da pergunta esteja
file.xml
e que os bits adicionais que devem aparecer no novodistributinManagement
nó estejamnew.xml
(mas não a própria tag do nó), é possível fazer o seguinte para inserirnew.xml
no nó raiz:Xmlstarlet vai escapar automaticamente os dados que precisa escapar, como
<
e>
personagens. Oxml unesc
bit remove os dados inseridos (na verdade, remove o documento inteiro, o que pode ou não ser um problema) exml fo
reformata o documento XML resultante.O resultado é
Estou um pouco desconfortável em fazer dessa maneira ", mas funciona".
Consulte também esta pergunta relacionada no StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt
fonte
provavelmente ainda é um exagero, mas se você estiver preocupado apenas com o tamanho do contêiner, poderá usar uma linguagem muito leve, como Lua ou Guile.
dos documentos de Lua:
fonte