Как получить иерархическую структуру элемента, используя XML :: Lib XML in perl - PullRequest
1 голос
/ 16 марта 2020

Как в этом HTML фрагменте: <div class="c1"><span class="c2"><b class="c3"/></span></div> Ожидаемая иерархическая структура элемента b должна быть: div.c1 span.c2 b.c3

1 Ответ

6 голосов
/ 16 марта 2020

В XML :: Lib XML :: 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;

Метод getAttribute находится в классе XML :: Lib XML :: Element .

...