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

jon*_*h_w 1 perl xml-libxml

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

zdi*_*dim 6

XML::LibXML::Node 中有一个parentNode方法,它只返回父节点。因此,您可以找到感兴趣的节点 ( b),然后向上“钻取”到树的顶部,收集有关节点的合适信息。对于所需的 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;
Run Code Online (Sandbox Code Playgroud)

getAttribute方法位于XML::LibXML::Element类中。