XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) ถูกเขียนใน C และการใช้งานและlibxml2
libxslt
รับเอกสาร XML
<?xml version="1.0"?>
<root>
<tag>data</tag>
</root>
โหนดย่อยที่root
อาจถูกแทรกโดยใช้
xml ed -s '/root' -t elem -n 'newtag' -v 'newdata' file.xml
ซึ่งผลิต
<?xml version="1.0"?>
<root>
<tag>data</tag>
<newtag>newdata</newtag>
</root>
การแทรกหลายสิ่ง (ใช้ต้นฉบับfile.xml
ที่ด้านบนที่นี่):
xml ed -s '/root' -t elem -n 'newtag' \
-s '/root/newtag' -t elem -n 'subtag' -v 'subdata' file.xml
สิ่งนี้ผลิต
<?xml version="1.0"?>
<root>
<tag>data</tag>
<newtag>
<subtag>subdata</subtag>
</newtag>
</root>
สำหรับตัวอย่างในคำถาม:
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
ผลลัพธ์:
<?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>
การแทรกไฟล์ XML ที่เตรียมไว้ก่อนหน้านี้ที่ตำแหน่งใน XML:
สมมติว่า XML ต้นฉบับจากคำถามนั้นอยู่ในfile.xml
และบิตเพิ่มเติมที่ควรไปในdistributinManagement
โหนดใหม่อยู่ในnew.xml
(แต่ไม่ใช่แท็กโหนดเอง) หนึ่งสามารถทำต่อไปนี้เพื่อแทรกnew.xml
ในโหนดรูต:
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 จะยกเว้นข้อมูลที่ต้องการยกเว้นโดยอัตโนมัติเช่น<
และ>
อักขระ xml unesc
บิตunescapesข้อมูลแทรก (มันจริง unescapes เอกสารทั้งหมดซึ่งอาจจะหรืออาจไม่เป็นปัญหา) และxml fo
ฟอร์แมตเอกสาร XML ที่เกิด
ผลที่ได้คือ
<?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>
ฉันรู้สึกไม่สบายใจที่จะทำแบบนี้ "แต่ก็ใช้งานได้"
ดูคำถามที่เกี่ยวข้องใน StackOverflow: /programming/29298507/xmlstarlet-xinclude-xslt