Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
使用PerlXML::Twig处理html嵌套列表元素_Xml_Perl_Xml Twig - Fatal编程技术网

使用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> &

我正在使用PerlXML::Twig处理html列表

列表元素具有另一个嵌套的列表元素,如

<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具有以前的同级,则返回