使用xmllint从xml文件中删除一行代码

时间:2017-12-28 14:19:19

标签: xml xml-parsing xmllint

我有 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

1 个答案:

答案 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