Как получить номера строк узлов с помощью XML::LibXML

Я пытаюсь обработать XML с помощью XML::LibXML и строк отчета, где определенные элементы есть. Согласно документам, указанным выше, опция line_numbers должна помочь, но я продолжаю получать 0. Код:

use XML::LibXML;

my $parser = XML::LibXML->new({ line_numbers => 1 });
my $xml = $parser->load_xml(location => 'some.xml');

for my $node ($xml->findnodes('//function')) {
    warn $node->nodePath,"\n";
    warn $node->line_number,"\n";
}

Узел найден, мой вывод

/database/functions/function
0

Любая идея, как заставить его работать?


person bvr    schedule 10.08.2011    source источник


Ответы (1)


Из документации:


$lineno = $node->line_number();

Эта функция возвращает номер строки, в которой тег был найден при синтаксическом анализе. Если в документ добавляется узел, номер строки равен 0. Могут возникнуть проблемы, если узел из одного документа передается в другой.

Если флаг line_numbers синтаксического анализатора не был активирован перед синтаксическим анализом, line_number() всегда будет возвращать 0.


Был ли узел добавлен в ходе обработки XML?


Это не так. Более тщательное расследование показало, что нарушающей функцией была функция load_xml. Замените его следующим, и он отлично работает:

my $xml = $parser->parse_file('some.xml');
person Zaid    schedule 10.08.2011
comment
Это не было изменено, вы можете увидеть полный фрагмент выше. Просто загрузите -> findnodes -> номер_строки. - person bvr; 10.08.2011
comment
Похоже только $parser->load_xml проблематично, а XML::LibXML->load_xml(location => $file, line_numbers => 1) тоже работает нормально. Похоже, виновато клонирование в load_xml. - person bvr; 10.08.2011
comment
для всех остальных. У меня это сработало так: мой $dom = XML::LibXML-›new({ line_numbers =› 1 })-›parse_file($xmlfilename); - person Sam B; 23.02.2019