如何编写一个bash脚本,将XML文件解析为输入并从文件中删除某些元素

如何编写一个bash脚本,将XML文件解析为输入并从文件中删除某些元素,xml,linux,bash,parsing,Xml,Linux,Bash,Parsing,我需要创建一个bash脚本来处理以下示例xml文件: 检查特定ID并删除该ID的XML分支 ID从文本文件中读取 <?xml version="1.0"?> <cmtf xmlns="urn:RM_UPMS_CMTFEnvelopeSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <data xmlns

我需要创建一个bash脚本来处理以下示例xml文件:

  • 检查特定ID并删除该ID的XML分支
  • ID从文本文件中读取

    <?xml version="1.0"?>
    <cmtf xmlns="urn:RM_UPMS_CMTFEnvelopeSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <data xmlns="">
    <entitygroup entityname="people">
      <PERSON xmlns="abc">
        <ID ns="">12280</ID>
        <PIN xmlns="">erererre</PIN>
        <NAME xmlns="">ereffdef</NAME>
      </PERSON>
      <PERSON xmlns="bbc">
        <ID ns="">5567</ID>
        <PIN xmlns="">erererre</PIN>
        <NAME xmlns="">ereffdef</NAME>
      </PERSON>
      <PERSON xmlns="bbc">
        <ID ns="">3347</ID>
        <PIN xmlns="">ededed</PIN>
        <NAME xmlns="">rtreer</NAME>
      </PERSON>
      <PERSON xmlns="bbc">
        <ID ns="">3249</ID>
        <PIN xmlns="">erererre</PIN>
        <NAME xmlns="">ereffdef</NAME>
      </PERSON>
    </entitygroup>
    </data>
    </cmtf> 
    
    
    12280
    埃雷雷尔
    埃雷夫德夫
    5567
    埃雷雷尔
    埃雷夫德夫
    3347
    埃德德
    里尔
    3249
    埃雷雷尔
    埃雷夫德夫
    

  • 在这里,我需要删除从文本文件读取的ID为12280、3249的所有条目的
    标记。

    也许您可以这样使用php:

    <?xml version="1.0"?>
    <cmtf xmlns="urn:RM_UPMS_CMTFEnvelopeSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <data xmlns="">
    <entitygroup entityname="people">
      <PERSON xmlns="abc">
        <ID ns="">12280</ID>
        <PIN xmlns="">erererre</PIN>
        <NAME xmlns="">ereffdef</NAME>
      </PERSON>
      <PERSON xmlns="bbc">
        <ID ns="">5567</ID>
        <PIN xmlns="">erererre</PIN>
        <NAME xmlns="">ereffdef</NAME>
      </PERSON>
      <PERSON xmlns="bbc">
        <ID ns="">3347</ID>
        <PIN xmlns="">ededed</PIN>
        <NAME xmlns="">rtreer</NAME>
      </PERSON>
      <PERSON xmlns="bbc">
        <ID ns="">3249</ID>
        <PIN xmlns="">erererre</PIN>
        <NAME xmlns="">ereffdef</NAME>
      </PERSON>
    </entitygroup>
    </data>
    </cmtf> 
    
    然后您可以使用类似domdocument()的内容来读取xml,并对其进行正确的排序

    当然,这是假设您已经安装了php。

    您可以使用它。创建一个xsl样式表,将输入xml转换为所需的输出。在控制台上,您可以使用
    xsltproc
    (来自
    xmllint
    包):


    这将从文件
    input\u文件
    中读取一系列要删除的ID,并基于
    input.xml
    创建一个
    output.xml
    ,删除这些条目:

    ed_commands=( )
    while read -r num_to_delete; do
      ed_commands+=( -d "//PERSON[./ID=$num_to_delete]"
    done <input_file
    
    xmlstarlet ed "${ed_commands[@]}" <input.xml >output.xml
    
    ed_命令=()
    读取时-r num_to_delete;做
    ed_命令+=(-d”//PERSON[/ID=$num_删除]”
    
    完成
    xml sed
    xml coreutils
    的一部分可能是您对xml文件执行简单操作的朋友。