如何用xmlstarlet查找指定字符串、删除对应节点并追加节点
使用xmlstarlet修改XML文件的节点操作
原始FILE.XML内容
<File>${IB}/OP/views/ACCOUNT.xml</File> <File>${IB}/OP/views/EMPLOYEES.xml</File <File>${IB}/OP/views/STATUS.xml</File>
需求
- 检查文件中是否存在匹配
ACCOUNT.xml的<File>节点 - 若存在,在该节点下方追加两个新节点:
<File>${IB}/OP/views/ACCOUNT_MAIN.xml</File> <File>${IB}/OP/views/ACCOUNT_SECONDARY.xml</File> - 删除原有的
ACCOUNT.xml节点 - 最终文件效果:
<File>${IB}/OP/views/ACCOUNT_MAIN.xml</File> <File>${IB}/OP/views/ACCOUNT_SECONDARY.xml</File> <File>${IB}/OP/views/EMPLOYEES.xml</File <File>${IB}/OP/views/STATUS.xml</File>
解决方案
操作顺序:必须先追加,再删除
只有保留原ACCOUNT.xml节点,才能通过它定位新节点的插入位置;如果先删除原节点,就无法指定新节点要放置的位置,导致新节点可能被添加到XML的其他区域。
修正并合并xmlstarlet命令
先修正你原有删除命令中的两处错误:
- XPath路径中的
view应为views(匹配原文件的完整路径) - 文本匹配需包含完整的
${IB}(原节点文本包含$符号)
以下是合并了追加和删除操作的完整命令,可一次性完成所有修改:
xmlstarlet ed -L \ -a '//rules/File[contains(text(),"${IB}/OP/views/ACCOUNT.xml")]' -t elem -n File -v '${IB}/OP/views/ACCOUNT_MAIN.xml' \ -a '//rules/File[contains(text(),"${IB}/OP/views/ACCOUNT.xml")]' -t elem -n File -v '${IB}/OP/views/ACCOUNT_SECONDARY.xml' \ -d '//rules/File[contains(text(),"${IB}/OP/views/ACCOUNT.xml")]' \ ${HOME}/FILE.XML
参数说明
-L:直接在原文件上修改(原地编辑)-a <xpath>:在指定XPath匹配的节点之后追加新元素-t elem:声明要创建的是元素节点-n File:指定新元素的名称为File-v <value>:设置新元素的文本内容-d <xpath>:删除指定XPath匹配的节点
执行逻辑
- 先在原
ACCOUNT.xml节点后追加第一个新节点ACCOUNT_MAIN.xml - 再次在原
ACCOUNT.xml节点后追加第二个新节点ACCOUNT_SECONDARY.xml(此时原节点仍存在,XPath可正确匹配) - 最后删除原
ACCOUNT.xml节点,得到目标格式的XML文件
内容的提问来源于stack exchange,提问作者John Al
相关产品推荐
相关产品推荐

