Bagaimana cara memanipulasi XML dari baris perintah dalam skrip shell?
Ada banyak perintah untuk memanipulasi data tabel, mengganti variabel lingkungan atau mengganti fragmen teks dengan regex, tetapi saya belum menemukan apa pun untuk XML.
Skrip build saya perlu menyisipkan tag dengan konten di dalam tag utama dari dokumen xml, dan saya merasa ini adalah kerja keras untuk menginstal java, perl atau python di OS untuk tujuan itu (skrip saya dikerjakan di gitlab dengan gambar docker, jadi melakukan pekerjaan saya dengan alat tersedia di maven: gambar 3,5-jdk-8 akan menjadi mimpi).
Saya tidak ingin memanipulasi XML dengan sed, meskipun dalam skrip build saya ini akan berhasil, karena itu jahat .
Contoh: Saya punya xml berikut:
<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>
Dan saya ingin menyisipkan blok berikut:
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
di dalam tag proyek (dan itu sepenuhnya tidak masalah apakah itu akan di awal atau di akhir.
sumber
maven
- Saya menduga ada cara yang lebih baik untuk melakukan apa yang Anda coba lakukan di dalam Maven sendiri.Jawaban:
XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) ditulis dalam C dan menggunakan
libxml2
danlibxslt
.Diberikan dokumen XML
sebuah subnode
root
dapat disisipkan menggunakanyang menghasilkan
Memasukkan banyak hal (menggunakan aslinya
file.xml
di atas sini):Ini menghasilkan
Sebagai contoh dalam pertanyaan:
Hasil:
Memasukkan file XML yang disiapkan sebelumnya di lokasi di XML:
Dengan asumsi XML asli dari pertanyaan sudah ada
file.xml
dan bit tambahan yang seharusnya ada didistributinManagement
simpul baru adanew.xml
(tetapi bukan tag simpul itu sendiri), orang bisa melakukan hal berikut untuk memasukkannew.xml
dalam simpul akar:XMLStarlet secara otomatis akan melarikan diri data yang perlu melarikan diri, seperti
<
dan>
karakter. Thexml unesc
bit unescapes data dimasukkan (sebenarnya unescapes seluruh dokumen, yang mungkin atau mungkin tidak menjadi masalah), danxml fo
memformat dokumen XML yang dihasilkan.Hasilnya adalah
Saya sedikit tidak nyaman melakukannya dengan cara ini, "tetapi berhasil".
Lihat juga pertanyaan terkait ini di StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt
sumber
mungkin masih berlebihan, tetapi jika Anda hanya peduli dengan ukuran wadah Anda bisa menggunakan bahasa yang sangat ringan seperti Lua atau Guile.
dari Lua docs:
sumber