2010-01-10 104 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

相關問題