【发布时间】:2017-01-15 14:46:41
【问题描述】:
我正在通过Perl XML::LibXML by Example 对XML::LibXML 的温和介绍,并且似乎无法使哈希属性正常工作。比如下面的代码有什么问题?
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
my $version = XML::LibXML::LIBXML_VERSION;
my $dot_version = XML::LibXML::LIBXML_DOTTED_VERSION;
my $run_version = XML::LibXML::LIBXML_RUNTIME_VERSION;
print "LibXML version: $version\n";
print "LibXML dotted version: $dot_version\n";
print "LibXML runtime version: $run_version\n";
print "Perl version: $^V\n";
my $xml = q{
<record>
<entry atr1="a" atr2="b" atr3="c" />
</record>
};
my $dom = XML::LibXML->load_xml( string => $xml );
my ($entry) = $dom->documentElement->getChildrenByTagName('entry');
print "\$entry is a: ", ref($entry), "\n";
print "node name: ", $entry->nodeName, "\n";
print "Attribute: ", $entry->getAttribute('atr1'), "\n"; # Line 26
print "Attribute: ", $entry->{'atr1'}, "\n"; # Line 27
输出如下:
$./hashtest.pl
LibXML version: 20706
LibXML dotted version: 2.7.6
LibXML runtime version: 20706
Perl version: v5.10.1
$entry is a: XML::LibXML::Element
node name: entry
Attribute: a
Not a HASH reference at ./hashtest.pl line 27.
我希望第 26 行和第 27 行具有相同的输出。任何指导将不胜感激。
编辑:添加了更完整的版本信息
【问题讨论】:
-
脚本在我的系统上工作,但如果
$entry->getAttribute('atr1')工作,你为什么关心$entry->{'atr1'}? -
如果你也加入
$XML::LibXML::VERSION就好了。 -
XML::LibXML::LIBXML_DOTTED_VERSION是一个返回底层 libxml 库版本的函数。显示标量$XML::LibXML::VERSION的值更有用,它是Perl 库的版本。当前可用的版本是 2.0128,我已经确定您的代码可以在 2.0124 上正常工作。但请注意ikegami's words below,您尝试使用的功能未记录在案,因此应视为不可用。我很想知道您是如何认为它会起作用的? -
您必须运行 非常 旧版本的
XML::LibXML。尽管您没有显示模块的版本,但您的输出显示它基于 libxml 2.7.6,于 7 年前于 2009 年 10 月发布。 -
感谢大家的回复。我无法访问
$XML::LibXML::VERSION函数,但能够找到XML::LibXML::LIBXML_VERSION,所以我认为这就是您的意思。然而,这些版本号似乎并不那么旧。您能否详细说明我应该查看哪个版本号?
标签: xml perl hash attributes libxml2