2010-01-16 6 views
6

मैं एक सरल xml फ़ाइल है कि इस तरह दिखता है:मेरी पर्ल की लिपि में इस 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'); 
    } 

लेकिन मैं प्राप्त किसी भी खोजने के लिए असफल रहने हूँ नोड्स। क्या आप मेरी मदद कर सकते हैं और बता सकते हैं कि यह क्यों काम नहीं कर रहा है? पर्ल फ़ंक्शंस को देखने के लिए सबसे अच्छी वेबसाइट क्या है ताकि मैं इसे स्वयं शूट करने में कोशिश कर सकूं? मैं स्क्रिप्ट कैसे प्राप्त कर सकता हूं यह बताने के लिए कि यह क्या कर रहा है, क्योंकि इस समय आउटपुट कुछ भी नहीं है। बहुत धन्यवाद।

उत्तर

5

आपने दस्तावेज़ के साथ एक नामस्थान उपसर्ग जोड़ा है, लेकिन आपके XPath सिंटैक्स इसका उपयोग नहीं करता है।

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

नौकरी करना चाहिए।

उपसर्ग के बिना आप मेल नहीं खाएंगे। इसके अलावा */species पथ केवल वर्तमान संदर्भ में बच्चों से मेल खाता है (यानी दस्तावेज़ का शीर्ष स्तर)। //species का उपयोग दस्तावेज़ में सभी species तत्वों को मिलेगा। (क्योंकि तत्व दस्तावेज़ आप मैच के लिए नहीं करना चाहती में कुछ अन्य संदर्भ में दिखाई देता है) है कि आप के लिए काम नहीं करता है तत्व के रूप में

/*/*/ns:species 

का उपयोग शीर्ष स्तर के एक 'महान पोता' है।

एक और XPath संदर्भ।

+1

/एनएस: माइक्रोप्रेट डॉक/एनएस: ऊंट/एनएस: प्रजातियां भी बीटीडब्ल्यू काम करती हैं ... –

संबंधित मुद्दे