0

我需要创建一个操作以下示例 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> 
    

在这里,我需要删除<PERSON>从文本文件中读取的 ID 为 12280、3249 的所有条目的所有标签。

4

3 回答 3

0

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

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

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

于 2013-08-08T11:36:38.410 回答
0

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

 xsltproc stylesheet.xsl input.xml
于 2013-08-08T11:44:09.883 回答
0

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

于 2014-02-18T16:45:56.870 回答