解析后如何从XML文件中删除元素?

时间:2010-08-02 07:04:09

标签: xml perl

假设XML文件是:

<class name=math>
<student>luke1</student>
...
<student>luke8000000</student>
</class>
<class name=english>
<student>mary1</student>
...
<student>mary1000000</student>
</class>

在解析class=math之后,我想从XML文件中删除此元素,以便在解析class=english时,Twig不会浏览class=math的内容。

我想这样做的原因是,到目前为止,即使我使用TwigRoots => {"class[\@name='english']" => \&counter},我还需要等待很长时间才能让Twig开始解析class=english,因为它需要遍历每个class=math的行(如果不需要越过每一行,请更正我)。在我运行的实际文件中,有几个类,我不想让Twig在找到它真正感兴趣的类之前通过class=math中的每一行。

提前致谢。

2 个答案:

答案 0 :(得分:3)

在构建树枝时可以使用ignore_elts选项:

ignore_elts
   This option lets you ignore elements when building the twig. This is useful
   in cases where you cannot use "twig_roots" to ignore elements, for example 
   if the element to ignore is a sibling of elements you are interested in.

           Example:

             my $twig= XML::Twig->new( ignore_elts => { elt => 1 });
             $twig->parsefile( 'doc.xml');

  This will build the complete twig for the document, except that all "elt" 
  elements (and their children) will be left out.

在这种情况下,您可以编写XML :: Twig-&gt; new(ignore_elts => { 'class[@name="math"]' => 1 }, ...来跳过这些元素

请注意,这些元素不会包含在树中,但仍会解析它们。这会加速一些事情,但不是那么多(量化数据怎么样?; - )在任何情况下都需要解析整个文件。

顺便说一句,你问题中的XML格式不正确,应该引用属性。

答案 1 :(得分:0)

我没有使用TWIG的删除功能,但请检查link 这有关于使用TWIG删除节点的一​​些信息

相关部分在这里:

    }
    else {
        $para->delete;
    }
}

段落处理程序的最后一部分从中删除了树枝 结果树,如果段落不包含指定的匹配项 关键词。这确保只有那些包含匹配的段落 将进入最终输出。

$para是传递给处理程序的元素。