如何使用基于标记的xml::Twig解析器在Unix上清理xml文件
我需要清除XML文件中不必要的信息(重复、过时等)。 我有具有不同命名标记的XML文件,但它们都具有相似的属性,我正在寻找一种解决方案,通过将参数传递给Perl解析器,从XML文件中删除一些标记 XML结构示例如下:如何使用基于标记的xml::Twig解析器在Unix上清理xml文件,xml,perl,unix,xml-parsing,Xml,Perl,Unix,Xml Parsing,我需要清除XML文件中不必要的信息(重复、过时等)。 我有具有不同命名标记的XML文件,但它们都具有相似的属性,我正在寻找一种解决方案,通过将参数传递给Perl解析器,从XML文件中删除一些标记 XML结构示例如下: <Jobs> <Job> <JobID>ID1</JobID> <DueDate>01-02-2008</DueDate> </Job> <Job> <JobID>ID2&l
<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::Twig
编写代码,这有助于使用Perl解决此任务
我需要在文件中的任何位置剪下标签,然后拉起它下面的所有其他标签并保存回文件(最好保存到同一个文件)
我需要一个Perl脚本,并像这样向它传递参数:
将两个参数传递到脚本:
R\u标签
R_标记\u嵌套
R_标记
删除,在我们的例子中是ID3
myscript.pl?R_标记&R_标记嵌套=ID3
但同时,我希望足够灵活,通过发送多个嵌套的标记参数(因为R\u 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>
ID1
01-02-2008
ID2
01-02-2009
ID4
01-02-2011
我还没有开始编写它,因为我没有太多使用XML::Twig剪切/粘贴/修剪XML的经验,需要帮助从头开始编写这段短代码。您还没有确定是什么给您带来了问题,所以我假设您正在问如何解决这个问题
当您想要从列表中移出筛选项时,哈希非常有用。生成以下哈希:
my%要删除=(
“ID3”=>1,
“ID5”=>1,
);
然后,这只是一个遍历您可能要删除的节点、获取其文本内容并删除这些节点的问题
以下是正确的:
$to_remove{$text_content}
是的,这是一个好主意,因为脚本的编写还没有开始——我仍在提出整个想法(这对其他人可能也很有用)我可能需要一个1Gb大小的XML文件,其中包含200万个JobID节点,然后需要从XML文件中删除700000个这样的节点。因此,它必须运行速度快,占用的内存最少。因此,第一步是从要删除的列表中构建哈希。XML::Twig的Twig_根
可以通过只构建感兴趣的子树来限制内存使用(例如,一次内存中只有一个作业)。我更熟悉XML::LibXML,所以我会使用XML::LibXML::Reader的copyCurrentNode(1)
来实现相同的结果。我不喜欢XML::Twig,只要它能完成任务,我很乐意使用其他任何东西。但我正在努力从头开始编写代码。我以后可以根据需要进行调整/修改,但整个基础略高于我的技能。
<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>