首页 > 解决方案 > 如何使用基于标签的 XML::Twig 解析器在 Unix 上清理 xml 文件

问题描述

我需要从不必要的信息(重复、过时等)中清理 XML 文件。我有具有不同命名标签的 XML 文件,但它们都具有相似的属性,我正在寻找一种解决方案,了解如何通过将参数传递给 Perl 解析器来从 XML 文件中删除一些标签。

一个示例 XML 结构是:

<Jobs>
<Job>
<JobID>ID1</JobID>
<DueDate>01-02-2008</DueDate>
</Job>
<Job>
<JobID>ID2</JobID>
<DueDate>01-02-2009</DueDate>
</Job>
<Job>
<JobID>ID3</JobID>
<DueDate>01-02-2010</DueDate>
</Job>
<Job>
<JobID>ID4</JobID>
<DueDate>01-02-2011</DueDate>
</Job>
<Job>
<JobID>ID5</JobID>
<DueDate>01-02-2012</DueDate>
</Job>
</Jobs>

现在假设我希望删除Job包含JobID文本标签的标签ID3,我的 output.xml 文件将变为:

<Jobs>
<Job>
<JobID>ID1</JobID>
<DueDate>01-02-2008</DueDate>
</Job>
<Job>
<JobID>ID2</JobID>
<DueDate>01-02-2009</DueDate>
</Job>
<Job>
<JobID>ID4</JobID>
<DueDate>01-02-2011</DueDate>
</Job>
<Job>
<JobID>ID5</JobID>
<DueDate>01-02-2012</DueDate>
</Job>
</Jobs>

请帮助我编写一个代码,使用XML::Twig它可以帮助使用 Perl根据此处提出的建议解决此任务

我需要在文件中的任何位置剪切标签并拉出它下面的所有其他标签并保存回文件(最好保存到同一个文件)。

我需要有一个 Perl 脚本并将参数传递给它,如下所示:

将两个参数传递给脚本:

  1. 必须删除的标签的名称,我们称之为R_tag
  2. 嵌套在 R_tag 下的标签的名称,我们称之为R_tag_nested
  3. 我们必须传递一个嵌套标签必须等于的值才能触发R_tag删除,在我们的例子中是ID3

我会使用这一行调用脚本 myscript.pl?R_tag&R_tag_nested=ID3

但与此同时,我希望足够灵活,以便通过发送多个嵌套标签参数(R_tag与整个文档相同)一次性删除 2 个或多个标签,命令将是:

myscript.pl?R_tag&R_tag_nested=ID3&R_tag_nested=ID5这会将这样的输出提供给 output.xml 文件:

<Jobs>
<Job>
<JobID>ID1</JobID>
<DueDate>01-02-2008</DueDate>
</Job>
<Job>
<JobID>ID2</JobID>
<DueDate>01-02-2009</DueDate>
</Job>
<Job>
<JobID>ID4</JobID>
<DueDate>01-02-2011</DueDate>
</Job>
</Jobs>

我还没有开始编写它,因为我没有太多使用 XML::Twig 剪切/粘贴/修剪 XML 的经验,并且需要帮助从头开始编写这个短代码。

标签: xmlperlunixxml-parsing

解决方案


你还没有确定是什么给你带来了问题,所以我假设你在问如何解决这个问题。


当您想从列表中过滤掉项目时,散列很有用。构建以下哈希:

my %to_remove = (
   "ID3" => 1,
   "ID5" => 1,
);

然后,这只是一个遍历您可能想要删除的节点、获取它们的文本内容并删除那些满足以下条件的节点的问题:

$to_remove{$text_content}

推荐阅读