(bash)如果缺少值,则从xml中删除元素

时间:2018-02-20 10:14:44

标签: bash sed xmlstarlet

如果缺少某个值,我想删除大型xml文件中的某些元素。

我找到了一个主题,其中说明了如何提取值存在的元素,而不是相反。解决方案可以是sed或xmlstartlet,但我无法弄清楚。

 xmlstarlet ed -d '//eslXmlDto[.//itemAssociations]' < file1.xml >> file2.xml

这是我的文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<screens>
    <screenXmlDto>
        <articleCodeType>EAN</articleCodeType>
        <creationDate>2017-04-25T12:23:18.746+02:00</creationDate>
        <domain>toto.tata</domain>
        <screenCode>16201000032884264000</screenCode>
        <itemAssociations>
            <itemCode>2118550000000</itemCode>
            <position>1</position>
        </itemAssociations>
    </screenXmlDto>
    <screenXmlDto>
        <articleCodeType>EAN</articleCodeType>
        <creationDate>2016-07-27T03:59:17.328+02:00</creationDate>
        <domain>toto.tata</domain>
        <screenCode>17201000030538183370</screenCode>
    </screenXmlDto>
    <screenXmlDto>
        <articleCodeType>EAN</articleCodeType>
        <creationDate>2016-07-26T12:28:20.815+02:00</creationDate>
        <domain>toto.tata</domain>
        <screenCode>17201000030538091000</screenCode>
        <itemAssociations>
            <itemCode>4008033444958</itemCode>
            <position>1</position>
        </itemAssociations>
    </screenXmlDto>
</screens>

这是我想要的输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<screens>
    <screenXmlDto>
        <articleCodeType>EAN</articleCodeType>
        <creationDate>2017-04-25T12:23:18.746+02:00</creationDate>
        <domain>toto.tata</domain>
        <screenCode>16201000032884264000</screenCode>
        <itemAssociations>
            <itemCode>2118550000000</itemCode>
            <position>1</position>
        </itemAssociations>
    </screenXmlDto>
    <screenXmlDto>
        <articleCodeType>EAN</articleCodeType>
        <creationDate>2016-07-26T12:28:20.815+02:00</creationDate>
        <domain>toto.tata</domain>
        <screenCode>17201000030538091000</screenCode>
        <itemAssociations>
            <itemCode>4008033444958</itemCode>
            <position>1</position>
        </itemAssociations>
    </screenXmlDto>
</screens>

1 个答案:

答案 0 :(得分:0)

xmlstarlet 解决方案:

xmlstarlet ed -d '//screenXmlDto[not(itemAssociations)]' file1.xml
  • -d - 删除操作
  • //screenXmlDto[not(itemAssociations)] - xpath表达式,用于选择作为子节点没有screenXmlDto个节点的所有itemAssociations个节点

输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<screens>
  <screenXmlDto>
    <articleCodeType>EAN</articleCodeType>
    <creationDate>2017-04-25T12:23:18.746+02:00</creationDate>
    <domain>toto.tata</domain>
    <screenCode>16201000032884264000</screenCode>
    <itemAssociations>
      <itemCode>2118550000000</itemCode>
      <position>1</position>
    </itemAssociations>
  </screenXmlDto>
  <screenXmlDto>
    <articleCodeType>EAN</articleCodeType>
    <creationDate>2016-07-26T12:28:20.815+02:00</creationDate>
    <domain>toto.tata</domain>
    <screenCode>17201000030538091000</screenCode>
    <itemAssociations>
      <itemCode>4008033444958</itemCode>
      <position>1</position>
    </itemAssociations>
  </screenXmlDto>
</screens>