6

我在 Perl中无法理解/使用带有XML::LibXML包的名称空间。我可以成功访问元素但不能访问属性。我有以下代码可以访问 XML 文件(http://pastebin.com/f3fb9d1d0)。

my $tree = $parser->parse_file($file); # parses the file contents into the new libXML object.
my $xpc = XML::LibXML::XPathContext->new($tree); 
$xpc->registerNs(microplateML => 'http://moleculardevices.com/microplateML');   

然后我尝试访问一个名为 common-name 的元素和一个名为 name 的属性。

foreach my $camelid ($xpc->findnodes('//microplateML:species')) {
  my $latin_name = $camelid->findvalue('@name');   
  my $common_name = $camelid->findvalue('common-name');  
  print "$latin_name, $common_name" ;
}

但只有拉丁名称 ( @name) 打印出来,通用名称没有。我做错了什么,我怎样才能打印出通用名称?

在这种情况下,@name 有什么作用?我认为它是一个数组,并且应该将属性放入一个数组中,因为可以有多个,但元素(如 common-name)不应该是因为应该只有一个?

我一直在关注这里的例子:http ://www.xml.com/pub/a/2001/11/14/xml-libxml.html 和这里: http: //perl-xml.sourceforge.net/faq /#namespaces_xpath,并试图让他们的示例骆驼脚本与我的命名空间一起工作,因此奇怪的命名空间。

4

1 回答 1

7

确保您的 XML 文件有效,然后用于$node->getAttribute("someAttribute")访问属性。

@name 是一个属性名称。您可以在 findnodes() 中使用它来指定具有给定属性集的元素。例如。像这样的路径:

//camelids/species[@name="Camelus bactrianus"]/

这是一个简单/人为的示例:

#!/usr/bin/perl -w
use XML::LibXML;

my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('/Users/castle/Desktop/animal.xml');

my $xc = XML::LibXML::XPathContext->new( $doc->documentElement()  );
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML');

my @n = $xc->findnodes('//ns:species');
foreach $nod (@n) {
    print "A: ".$nod->getAttribute("name")."\n";

    my @c = $xc->findnodes("./ns:common-name", $nod);
    foreach $cod (@c) {
        print "B: ".$cod->nodeName;
        print " = ";
        print $cod->getFirstChild()->getData()."\n";
    }
}

输出是:

perl ./xmltest.pl 
A: Camelus bactrianus
B: common-name = Bactrian Camel
于 2010-01-11T00:00:29.930 回答