我有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
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
的service1
节点要修改文件“inplace” - 添加-L
选项:xmlstarlet ed -L ...