提问人:Erlandas 提问时间:9/22/2020 最后编辑:Erlandas 更新时间:9/23/2020 访问量:60
如何使用基于标签的 XML::Twig 解析器在 Unix 上清理 xml 文件 [已关闭]
How to cleanup xml file on Unix using XML::Twig parser based on tags [closed]
问:
我需要从不必要的信息(重复的、过时的等)中清理 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>
现在假设我希望剪掉包含带有文本标签的标签,我的输出 .xml 文件将变为:Job
JobID
ID3
<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>
请帮我编写一个代码,该代码可以帮助使用Perl解决此任务 基于此处提出的建议XML::Twig
我需要在文件中的任何位置剪切标签,然后拉出它下面的所有其他标签并保存回文件(最好保存到同一个文件)。
我需要一个Perl脚本,并像这样向它传递参数:
将两个参数传递到脚本上:
- 必须删除的标签的名称,我们称之为它
R_tag
- 嵌套在R_tag下的标签的名称,我们称之为
R_tag_nested
- 我们必须传递一个嵌套标签必须等于的值才能触发删除,在我们的例子中是
R_tag
ID3
我会使用此行调用脚本myscript.pl?R_tag&R_tag_nested=ID3
但与此同时,我希望足够灵活,以便通过发送多个嵌套标签参数(整个文档相同)一次性剪切 2 个或更多标签,命令将是:R_tag
myscript.pl?R_tag&R_tag_nested=ID3&R_tag_nested=ID5
这将为输出 .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 方面没有太多经验,并且需要帮助从头开始编写此短代码。
答:
1赞
ikegami
9/22/2020
#1
你还没有确定是什么给你带来了问题,所以我假设你在问如何解决这个问题。
当您想要从列表中移出筛选出项目时,哈希值很有用。生成以下哈希:
my %to_remove = (
"ID3" => 1,
"ID5" => 1,
);
然后,只需遍历您可能要删除的节点,获取其文本内容,然后删除这些节点 对于以下情况:
$to_remove{$text_content}
评论
0赞
Erlandas
9/22/2020
是的,这是一个好主意,而且由于脚本的编写甚至还没有开始 - 我仍然以有序的方式提出整个想法(这可能对其他人也非常有用),因为我可能需要获取一个 1Gb 大小的 XML 文件,其中包含 200 万个 JobID 节点,然后需要从 XML 文件中删除大约 700,000 个这样的节点。因此,它必须运行速度快并消耗最少的内存。因此,第一步是从要删除的列表中构建哈希值。
0赞
ikegami
9/22/2020
XML::Twig 可用于通过仅构建感兴趣的子树来限制内存使用(例如,一次只有一个 Job 在内存中)。我更熟悉 XML::LibXML,所以我会使用 XML::LibXML::Reader 来获得相同的结果。twig_roots
copyCurrentNode(1)
0赞
Erlandas
9/23/2020
我不依附于XML::Twig,只要它能完成工作,我很乐意使用其他任何东西。但我正在努力从头开始编写代码。我可以稍后根据需要调整/修改它,但整个基础略高于我的技能。
评论