XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) ditulis dalam C dan menggunakan libxml2
dan libxslt
.
Diberikan dokumen XML
<?xml version="1.0"?>
<root>
<tag>data</tag>
</root>
sebuah subnode root
dapat disisipkan menggunakan
xml ed -s '/root' -t elem -n 'newtag' -v 'newdata' file.xml
yang menghasilkan
<?xml version="1.0"?>
<root>
<tag>data</tag>
<newtag>newdata</newtag>
</root>
Memasukkan banyak hal (menggunakan aslinya file.xml
di atas sini):
xml ed -s '/root' -t elem -n 'newtag' \
-s '/root/newtag' -t elem -n 'subtag' -v 'subdata' file.xml
Ini menghasilkan
<?xml version="1.0"?>
<root>
<tag>data</tag>
<newtag>
<subtag>subdata</subtag>
</newtag>
</root>
Sebagai contoh dalam pertanyaan:
xml ed -N x="http://maven.apache.org/POM/4.0.0" \
-s '/x:project' -t elem -n 'distributionManagement' \
-s '/x:project/distributionManagement' -t elem -n 'repository' \
-s '/x:project/distributionManagement/repository' -t elem -n 'id' \
-v 'private-releases' \
-s '/x:project/distributionManagement/repository' -t elem -n 'url' \
-v 'https://my.private.server.com/nexus/repository/maven-releases/' \
file.xml
Hasil:
<?xml version="1.0"?>
<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-->
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
</project>
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 di distributinManagement
simpul baru ada new.xml
(tetapi bukan tag simpul itu sendiri), orang bisa melakukan hal berikut untuk memasukkan new.xml
dalam simpul akar:
xml ed -N x="http://maven.apache.org/POM/4.0.0" \
-s '/x:project' -t elem -n 'distributionManagement' \
-v "$(<new.xml)" file.xml | xml unesc | xml fo
XMLStarlet secara otomatis akan melarikan diri data yang perlu melarikan diri, seperti <
dan >
karakter. The xml unesc
bit unescapes data dimasukkan (sebenarnya unescapes seluruh dokumen, yang mungkin atau mungkin tidak menjadi masalah), dan xml fo
memformat dokumen XML yang dihasilkan.
Hasilnya adalah
<?xml version="1.0"?>
<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-->
<distributionManagement>
<repository>
<id>private-releases</id>
<url>https://my.private.server.com/nexus/repository/maven-releases/</url>
</repository>
</distributionManagement>
</project>
Saya sedikit tidak nyaman melakukannya dengan cara ini, "tetapi berhasil".
Lihat juga pertanyaan terkait ini di StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt