2010-01-16 4 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> 

:

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 : 종은 너무 작을 것입니다 ... –