2

输入数据:(一些带有链接的嵌套列表)

<ul>
    <li><a>1</a>
        <ul>
            <li><a>11</a>
                <ul>
                    <li><a>111</a></li>
                    <li><a>112</a></li>
                    <li><a>113</a>
                    <ul>
                        <li><a>1131</a></li>
                        <li><a>1132</a></li>
                        <li><a>1133</a></li>
                    </ul></li>
                    <li><a>114</a></li>
                    <li><a>115</a></li>
                </ul>
            </li>
            <li><a>12</a>
                <ul>
                    <li><a>121</a>
                    <ul>
                        <li><a>1211</a></li>
                        <li><a>1212</a></li>
                        <li><a>1213</a></li>
                    </ul></li>
                    <li><a>122</a></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

输出字符串数组:

 1,11,111
 1,11,112
 1,11,113,1131
 1,11,113,1132
 1,11,113,1133
 1,11,114
 1,11,115
 1,12,121,1211
 1,12,121,1212
 1,12,121,1213
 1,12,122

包含元素文本的完整路径

  • 没有孩子。

    我尝试了什么: 1. XML::SAX::ParserFactory

    https://gist.github.com/7266638这里有很多问题。如何检测 li 是否持续,如何保存路径等。我认为这是不好的方式。

    1. 它完全不是正则表达式,因为现实生活中的例子 html 更糟糕。很多标签,div,span等

    多姆? 但是怎么做?

  • 4

    1 回答 1

    3

    您可以尝试使用XML::Twig模块。它保存元素中的所有文本,并且仅在其中一个元素下<a>没有子元素时才打印它们。<ul><li>

    #!/usr/bin/env perl
    
    use warnings;
    use strict;
    use XML::Twig;
    
    my (@li);
    
    my $twig = XML::Twig->new(
            twig_handlers => {
                    'a' => sub {
                            if ( $_->prev_elt('li') ) { 
                                    push @li, $_->text;
                            }   
                    },  
                    'li' => sub {
                            unless ( $_->children('ul') ) { 
                                    printf qq|%s\n|, join q|,|, @li;
                            }   
                            pop @li;
                    },  
            },  
    )->parsefile( shift );
    

    像这样运行它:

    perl script.pl xmlfile
    

    这会产生:

    1,11,111
    1,11,112
    1,11,113,1131
    1,11,113,1132
    1,11,113,1133
    1,11,114
    1,11,115
    1,12,121,1211
    1,12,121,1212
    1,12,121,1213
    1,12,122
    
    于 2013-11-01T16:28:07.397 回答