需要使用 Perl 查找 HTML/XML 嵌套标记级别

Need to finding HTML/XML nested tag levels using Perl

他们是否有任何简单的方法来查找嵌套形式的标签级别,即没有。具有相同标签名称的父元素。

注意:我打算创建一个子例程,如果我传递如下输入的标量,它应该 return 输出如下所示的标量。

我需要使用 Perl 从输入中得到如下所示的输出。

输入:

<sec>
  <sec></sec>
  <sec>
    <sec></sec>
  </sec>
</sec>

输出应该是:

<sec level="1">
  <sec level="2"></sec>
  <sec level="2">
    <sec level="3"></sec>
  </sec>
</sec>

一种方法,使用 XML::LibXML 从 XML 生成 DOM 树,然后遍历树,将递增级别属性添加到匹配标签:

#!/usr/bin/env perl
use warnings;
use strict;
use XML::LibXML;

# Recursively walk a DOM tree, and invoke callbacks on elements
sub walk_elements {
    my ($node, $callbacks) = @_;
    $callbacks->{pre}->($node) if $node->nodeType == XML_ELEMENT_NODE;
    for my $child ($node->childNodes) {
        walk_elements($child, $callbacks);
    }
    $callbacks->{post}->($node) if $node->nodeType == XML_ELEMENT_NODE;
}

sub add_levels {
    my ($xml, $tagname) = @_;
    my $dom = XML::LibXML->load_xml(string => $xml);
    my $level = 1;
    walk_elements($dom->getDocumentElement,
                { pre => sub {
                    $_[0]->setAttribute('level', $level++)
                        if $_[0]->nodeName eq $tagname
                  },
                  post => sub { $level-- if $_[0]->nodeName eq $tagname }
                }
        );
    return $dom->toStringHTML; # Or toString for XML style tags
}

my $xml = <<EOXML;
<sec>
  <sec></sec>
  <sec>
    <sec></sec>
  </sec>
</sec>
EOXML

print add_levels($xml, 'sec');

运行 这个脚本输出

<sec level="1">
  <sec level="2"></sec>
  <sec level="2">
    <sec level="3"></sec>
  </sec>
</sec>