假设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
中的每一行。
提前致谢。
答案 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
是传递给处理程序的元素。