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

问题描述 投票:0回答:1

我有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
xml xml-parsing xmllint
1个回答
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的子节点ServiceNameservice1节点

要修改文件“inplace” - 添加-L选项:xmlstarlet ed -L ...

© www.soinside.com 2019 - 2024. All rights reserved.