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

时间:2013-08-08 11:22:57

标签: xml linux bash parsing

我需要创建一个操作以下示例xml文件的bash脚本:

  1. 检查特定ID并删除该ID的XML分支。
  2. 从文本文件中读取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> 
    
  3. 在这里,我需要删除所有从文本文件中读取ID为12280,3249的条目的<PERSON>标记。

3 个答案:

答案 0 :(得分:0)

也许你可以像这样使用php:running php script (php function) in linux bash

然后你就像domdocument(http://php.net/manual/en/class.domdocument.php)这样的东西来阅读和正确的xml。

当然这是假设你安装了php。

答案 1 :(得分:0)

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

 xsltproc stylesheet.xsl input.xml

答案 2 :(得分:0)

这会从文件input_file中读取要删除的一系列ID,并根据output.xml创建input.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

请注意,它需要XMLStarlet