我有 Test.xml 文件,其中包含以下内容。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright XXXXXX -->
<services>
<service>
<ServiceName>service1</ServiceName>
<ServiceId>100</ServiceId>
</service>
<service>
<ServiceName>service2</ServiceName>
<ServiceId>200</ServiceId>
</service>
<service>
<ServiceName>service3</ServiceName>
<ServiceId>300</ServiceId>
</service>
</services>
根据服务名称,我必须删除该服务的整个块。
假设 service1 是我输入的名称,那么应该从xml中删除以下块。
<service>
<ServiceName>service1</ServiceName>
<ServiceId>100</ServiceId>
</service>
我可以使用awk/sed/grep
来完成此操作。但我应该在这里使用 xmllint 或其他一些xml解析实用程序。
经过研究,我可以使用下面的命令关闭输出。但是,输出中缺少xml版本和父标记(服务)。
xmllint --xpath "//services/service[ServiceName!='service1']" Test.xml
答案 0 :(得分:1)
xmlstarlet
解决方案:
xmlstarlet ed -d "//service[ServiceName='service1']" test.xml
输出:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright XXXXXX -->
<services>
<service>
<ServiceName>service2</ServiceName>
<ServiceId>200</ServiceId>
</service>
<service>
<ServiceName>service3</ServiceName>
<ServiceId>300</ServiceId>
</service>
</services>
//service[ServiceName='service1']
- xpath 表达式,选择具有值为service
的子节点ServiceName
的{{1}}节点修改文件&#34; inplace&#34; - 添加service1
选项:-L