Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl';要在标记之间提取内容吗?_Perl_Xml Libxml - Fatal编程技术网

如何使用Perl';要在标记之间提取内容吗?

如何使用Perl';要在标记之间提取内容吗?,perl,xml-libxml,Perl,Xml Libxml,我有一个XML文件,内容如下: <Node id="7"/> www <Node id="10"/> 万维网 如何使用XML::LibXML和Perl在两个节点(即“www”)之间获取内容 谢谢。您处理的XML格式太糟糕了* 给定一个节点,您希望节点是它的同级节点,紧跟在它之后(除了中间注释),并且是文本节点 use strict; use warnings; use feature qw( say ); use XML::LibXML qw( XML_COMME

我有一个XML文件,内容如下:

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

万维网
如何使用XML::LibXML和Perl在两个节点(即“www”)之间获取内容


谢谢。

您处理的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;

\u数据__
万维网
酒吧

*-
www
应该是
节点的子节点
。例如,
www
会更好。

谢谢你的回复。这很有帮助。解决方案的关键是“nextSibling()”方法。对于XML格式,是的,这很糟糕,但我不能将其更改为另一种格式。所以,我必须处理这个问题。但是没关系,我现在可以从xml文件中提取我想要的内容。@user1437832,如果答案满足您的需要,请批准它(单击复选标记)以标记您的问题已解决。
__DATA__
<root>
<Node id="7"/>
www
<Node id="10"/>
bar
</root>