2010-01-16 32 views
6

我有一個簡單的XML文件看起來像這樣:我的Perl腳本中的findnodes語句有什麼問題?

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<microplateDoc xmlns="http://moleculardevices.com/microplateML"> 
<camelids> 
    <species name="Camelus bactrianus"> 
    <common-name>Bactrian Camel</common-name> 
    <physical-characteristics> 
     <mass>450 to 500 kg.</mass> 
     <appearance> 
    Blah blah blah 
    </appearance> 
    </physical-characteristics> 
    </species> 
    </camelids> 
</microplateDoc> 

我想用下面的Perl腳本來讀取物種名稱:

use XML::LibXML; 

my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_file('/Users/johncumbers/Documents/7_Scripts/Perl/XML_to_MySQL/simplified_camelids.xml'); 
my $xc = XML::LibXML::XPathContext->new($doc->documentElement() ); 
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML'); 

#loop through to find species nodes 
my @n = $xc->findnodes('*/species'); #was */species 
foreach $nod (@n) { 
    print "A: ".$nod->getAttribute("name")."\n"; 
    my @c = $nod->findnodes('./common-name'); 
    } 

但我沒有得到任何發現節點。你能幫助並告訴我爲什麼它不能正常工作嗎?什麼是查看perl函數的最佳網站,以便我可以自己嘗試並自行解決這個問題?我怎樣才能讓腳本告訴我它在做什麼,因爲目前的輸出結果是什麼都沒有。非常感謝。

回答

5

您已將名稱空間前綴與文檔關聯,但您的XPath語法不使用它。

my @n = $xc->findnodes('//ns:species'); 

應該做的工作。

沒有前綴,你不會匹配。此外*/species路徑只會匹配當前上下文中的子級(即文檔的頂級)。使用//species將在文檔中找到所有species元素。如果不爲你工作(因爲元素出現在你不想匹配文檔在其他一些情況下)使用

/*/*/ns:species 

的元素是頂級的「曾孫」。

多一個XPath參考。

+1

/ns:microplateDoc/ns:camelids/ns:species would work btw ... – 2010-01-17 00:37:40