Jak manipulować XML z wiersza poleceń w skrypcie powłoki?
Istnieje wiele poleceń do manipulowania danymi tabelarycznymi, zastępowania zmiennych środowiskowych lub zastępowania fragmentów tekstu wyrażeniami regularnymi, ale nic nie znalazłem dla XML.
Mój skrypt kompilacji musi wstawić znacznik z zawartością w głównym znaczniku dokumentu xml i uważam, że przesadzenie polega na zainstalowaniu java, perl lub python w OS w tym celu (moje skrypty są wykonywane w gitlab z obrazami dokerów, więc robię to moja praca z narzędziami dostępnymi w maven: obraz 3,5-jdk-8 byłaby snem).
Nie chcę manipulować XML za pomocą sed, chociaż w moim skrypcie kompilacji to działałoby, ponieważ jest złe .
Przykład: Mam następujący plik 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>
I chcę wstawić następujący blok:
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
wewnątrz tagu projektu (i nie ma w pełni znaczenia, czy będzie na początku, czy na końcu).
źródło
maven
- Podejrzewam, że jest lepszy sposób na robienie tego, co próbujesz zrobić w samym Maven.Odpowiedzi:
XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) jest napisany w C i używa
libxml2
ilibxslt
.Biorąc pod uwagę dokument XML
podwęzeł, do którego
root
można wstawić, używającktóry produkuje
Wstawianie wielu rzeczy (używając oryginału
file.xml
u góry tutaj):To produkuje
Na przykład w pytaniu:
Wynik:
Wstawianie wcześniej przygotowanego pliku XML w lokalizacji w pliku XML:
Zakładając, że oryginalny kod XML z pytania jest w,
file.xml
a dodatkowe bity, które powinny przejść w nowymdistributinManagement
węźle, znajdują się wnew.xml
(ale nie w samym znaczniku węzła), można wykonać następujące czynności, aby wstawićnew.xml
do węzła głównego:XMLStarlet automatycznie usunie dane, które wymagają zmiany znaczenia, takie jak
<
i>
znaki.xml unesc
Nieco unescapes wstawione dane (faktycznie unescapes cały dokument, który może lub nie może być problemem) ixml fo
formatuje wynikowego dokumentu XML.Wynik to
Jestem trochę zaniepokojony robieniem tego w ten sposób, „ale to działa”.
Zobacz także podobne pytanie dotyczące StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt
źródło
prawdopodobnie nadal jest to przesada, ale jeśli martwisz się tylko pojemnikiem, możesz użyć bardzo lekkiego języka, takiego jak Lua lub Guile.
z dokumentów Lua:
źródło