【问题标题】:XML::LibXML::Reader return value without cdata tagXML::LibXML::Reader 返回没有 cdata 标记的值
【发布时间】:2018-11-07 13:13:33
【问题描述】:

我正在使用 XML::LibXML::Reader 读取 xml 文件

my $reader = XML::LibXML::Reader->new(IO => $fh, load_ext_dtd => 0) or die qq(cannot read content: $!);

while ($reader->nextElement( 'item' )) {

    my $copy = $reader->copyCurrentNode(1);

    my $title = $copy->findvalue( 'title' );  

}

然而,xml中的标题是在一个CDATA标签内,所以如果我看它,它就像

<![CDATA[Some title here]]>

我自然可以使用一些正则表达式来摆脱额外的标签,但我想知道是否有一种更简洁的方式让 XML::LibXML::reader 返回没有 cdata 标签的标题?

我一直在查看文档,但找不到任何关于这样做的方法的参考。

【问题讨论】:

  • 顺便说一句,你的第一行有两个错误。 1)-&gt;new 不是系统调用,所以$! 出错时没有意义。 2) -&gt;new 出错时不返回 undef;它会引发异常。
  • 谢谢 ikegami 我会改正的

标签: perl xml-libxml


【解决方案1】:

解析器的工作是为您解码 XML,因此findvalue 已经返回您想要的内容。

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

use XML::LibXML::Reader qw( );

my $xml = '<root><item><title><![CDATA[Some title here]]></title></item></root>';

my $reader = XML::LibXML::Reader->new(string => $xml, load_ext_dtd => 0);
while ($reader->nextElement( 'item' )) {
    my $copy = $reader->copyCurrentNode(1);
    my $title = $copy->findvalue( 'title' );
    say $title;       # Some title here
}

【讨论】:

  • 我是个白痴,我错过了他们的 cdata 标签上的错字。谢谢
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 2011-02-11
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2011-12-08
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多