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
位取消转义插入的数据(实际上取消转义整个文档,这可能是问题,也可能不是问题),并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上的相关问题:https ://stackoverflow.com/questions/29298507/xmlstarlet-xinclude-xslt