Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用基于标记的xml::Twig解析器在Unix上清理xml文件_Xml_Perl_Unix_Xml Parsing - Fatal编程技术网

如何使用基于标记的xml::Twig解析器在Unix上清理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

我需要清除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::Twig
编写代码,这有助于使用Perl解决此任务

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

我需要一个Perl脚本,并像这样向它传递参数:

将两个参数传递到脚本:

  • 必须删除的标签的名称,我们称之为
    R\u标签
  • 嵌套在R_标记下的标记的名称,我们称之为
    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>