【问题标题】:handling html nested list element using perl XML::Twig使用 perl XML::Twig 处理 html 嵌套列表元素
【发布时间】:2016-07-01 01:10:46
【问题描述】:

我正在使用 perl XML::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 获取此输出

提前致谢。

【问题讨论】:

    标签: xml perl xml-twig


    【解决方案1】:

    您可以通过在标量上下文中使用ancestors( '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>
    

    【讨论】:

    • 感谢 Mirod,它按预期工作。你能帮我如何跳过每个 中的第二个

      元素。

    • 如果您想跳过 2cd p,但输出所有其他 p,请在处理程序的开头添加 return if $_-&gt;prev_siblings('p') == 1;(如果当前 p 有一个先前的兄弟,则返回)。如果只想输出第一个p,则添加return if $_-&gt;prev_sibling('p');(如果当前p有前一个兄弟则返回)
    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多