2010-01-10 100 views
5

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

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在这种情况下做了什么?我认为它是一个数组,并且该属性应该放入一个数组中,因为可以有多个属性,但元素(如通用名称)不应该是因为应该只有一个?

我一直在这里遵循的例子:http://www.xml.com/pub/a/2001/11/14/xml-libxml.html 这里:http://perl-xml.sourceforge.net/faq/#namespaces_xpath,并试图让他们的榜样骆驼剧本与我的命名空间的工作,因此怪异的命名空间。

回答

6

确保您的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 
+0

感谢尼尔斯,我得到了我原来的问题走错了路周围,拉丁文名字(@name)打印出来很好,但通用名称不是。不知道这是否会改变你的答案。我试过你的例子,但是我根本无法打印任何东西。我遇到的问题更多地与我想的命名空间有关。如果我不使用前两个命名空间行(在它们中带有$ xpc),并且只需引用elemtents,如http://www.xml.com/pub/a/2001/11/14/xml-libxml中的示例.html然后一切都很好,但是当我包含名称空间时,它不起作用,但我不知道elementIwant – John 2010-01-12 07:30:51

+0

我删除了名称空间并平衡了您所指的用于使示例运行的XML文件中的标记。我将添加命名空间到示例。 – 2010-01-12 15:30:47

+0

我在pastebin上更新了您的XML文件http://pastebin.com/f3fb9d1d0 – 2010-01-12 18:13:36

相关问题