Как я могу использовать Perl XML::LibXML для извлечения контента между тегами?

У меня есть XML-файл с таким содержимым:

<Node id="7"/>
www
<Node id="10"/>

Как можно использовать XML::LibXML и Perl для переноса контента между двумя узлами, то есть "www"?

Спасибо.

1 ответ

Решение

Формат XML, с которым вы имеете дело, ужасен!*

Для данного узла вам нужны узлы, которые являются его братьями и сестрами, сразу же следуют за ним (за исключением, возможно, промежуточных комментариев) и являются текстовыми узлами.

use strict;
use warnings;
use feature qw( say );

use XML::LibXML qw( XML_COMMENT_NODE XML_TEXT_NODE );

sub following_text {
   my ($node) = @_;
   my $text = '';
   while ($node = $node->nextSibling()) {
      my $node_type = $node->nodeType();
      next if $node_type == XML_COMMENT_NODE;
      last if $node_type != XML_TEXT_NODE;
      $text .= $node->data();   
   }

   return $text;
}

my $parser = XML::LibXML->new();
my $doc    = $parser->parse_fh(\*DATA);
my $root   = $doc->documentElement();
my ($node) = $root->findnodes('//Node[@id="7"]');
my $text   = following_text($node);

say $text;

__DATA__
<root>
<Node id="7"/>
www
<Node id="10"/>
bar
</root>

* - www должен быть ребенком Node, Например, <Node id="7">www</Node> было бы лучше.

Другие вопросы по тегам