使用PerlXML::Twig处理html嵌套列表元素
我正在使用PerlXML::Twig处理html列表 列表元素具有另一个嵌套的列表元素,如使用PerlXML::Twig处理html嵌套列表元素,xml,perl,xml-twig,Xml,Perl,Xml Twig,我正在使用PerlXML::Twig处理html列表 列表元素具有另一个嵌套的列表元素,如 <list list-type="bullet"> <list-item> <p>Linea</p> <list list-type="bullet"> <list-item> <p>Uno</p> </list-item> &
<list list-type="bullet">
<list-item>
<p>Linea</p>
<list list-type="bullet">
<list-item>
<p>Uno</p>
</list-item>
<list-item>
<p>vitara</p>
</list-item>
</list>
</list-item>
<list-item>
<p>Panda</p>
</list-item>
</list>
输出应该是
<p>* Linea</p>
<p>** Uno</p>
<p>** vitara</p>
<p>* Panda</p>
这里有人能帮我使用XML::Twig获得这个输出吗
提前感谢。您可以使用标量上下文中的祖先“list”获取封闭列表的数量,该列表返回列表的元素数量。使用此值生成具有适当数量“*”的前缀:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
XML::Twig->new( twig_handlers => {
'list-item/p' => sub { my $level= $_->ancestors( 'list');
$_->prefix( '*' x $level . ' ');
$_->print;
print "\n";
}
}
)
->parse( \*DATA);
__DATA__
<list list-type="bullet">
<list-item>
<p>Linea</p>
<list list-type="bullet">
<list-item>
<p>Uno</p>
</list-item>
<list-item>
<p>vitara</p>
</list-item>
</list>
</list-item>
<list-item>
<p>Panda</p>
</list-item>
</list>
您可以通过在标量上下文中使用祖先“list”来获取封闭列表的数量,该上下文返回列表的元素数量。使用此值生成具有适当数量“*”的前缀:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
XML::Twig->new( twig_handlers => {
'list-item/p' => sub { my $level= $_->ancestors( 'list');
$_->prefix( '*' x $level . ' ');
$_->print;
print "\n";
}
}
)
->parse( \*DATA);
__DATA__
<list list-type="bullet">
<list-item>
<p>Linea</p>
<list list-type="bullet">
<list-item>
<p>Uno</p>
</list-item>
<list-item>
<p>vitara</p>
</list-item>
</list>
</list-item>
<list-item>
<p>Panda</p>
</list-item>
</list>
谢谢米罗德,它的工作如预期。您能帮助我如何跳过每个元素中的第二个元素吗?如果您想跳过2cd p,但输出所有其他元素,请在$p->prev\u同胞'p'==1时添加return;在处理程序开始时,如果当前p有一个以前的同级,则返回。如果您只想输出第一个p,那么在$p->prev_同级'p'时添加return;如果当前p有一个以前的同级,则返回Mirod,它将按预期工作。您能帮助我如何跳过每个元素中的第二个元素吗?如果您想跳过2cd p,但输出所有其他元素,请在$p->prev\u同胞'p'==1时添加return;在处理程序开始时,如果当前p有一个以前的同级,则返回。如果您只想输出第一个p,那么在$p->prev_同级'p'时添加return;如果当前p具有以前的同级,则返回