如何在perl中使用XML::LibXML获取元素的层次结构

How to get the hierarchy structure of an element using XML::LibXML in perl

就像这个 HTML 片段: <div class="c1"><span class="c2"><b class="c3"/></span></div> b 元素的预期层次结构应为:div.c1 span.c2 b.c3

XML::LibXML::Node中有parentNode方法,就是returns父节点。这样您就可以找到您感兴趣的节点 (b) 然后 'drill' 向上到树的顶部,收集有关节点的适当信息。对于所需的 element.class 格式:

use warnings;
use strict;
use feature 'say';

use XML::LibXML;

my $xml = q(<div class="c1"><span class="c2"><b class="c3"/></span></div>);

my $doc = XML::LibXML->load_xml(string => $xml);

my @hier;

my ($node) = $doc->findnodes('//b');  # only first such node assigned

unshift @hier, join '.', $node->nodeName, $node->getAttribute('class');

while (my $parent = $node->parentNode) {
    last if $parent->nodeType == XML_DOCUMENT_NODE;  # top, <?xml ...    

    unshift @hier, join '.', $parent->nodeName, $parent->getAttribute('class');
    $node = $parent;
}

say for @hier;

getAttribute方法在XML::LibXML::Elementclass.