2010-01-10 10 views
5

मुझे पर्ल में XML::LibXML पैकेज के साथ नाम रिक्त स्थान को समझने/उपयोग करने में समस्या हो रही है। मैं एक तत्व को सफलतापूर्वक एक्सेस कर सकता हूं लेकिन एक विशेषता नहीं। मेरे पास निम्न कोड है जो एक XML फ़ाइल (http://pastebin.com/f3fb9d1d0) तक पहुंचता है।मैं पर्ल में 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'); 

मैं फिर सामान्य नाम और नाम नामक एक तत्व को आज़माकर एक्सेस करता हूं।

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() में इसका उपयोग करेंगे। उदाहरण के लिए। की तरह एक पथ:

#!/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"; 
    } 
} 

आउटपुट है:

//camelids/species[@name="Camelus bactrianus"]/

यहाँ एक सरल/काल्पनिक उदाहरण है

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

+0

मैं नाम स्थान और एक्सएमएल फ़ाइल आप उदाहरण रन बनाने के लिए चर्चा करते हुए थे में संतुलित टैग हटा दिया। मैं उदाहरण के लिए नामस्थान जोड़ दूंगा। –

+0

मैंने पेस्टबिन पर अपनी एक्सएमएल फ़ाइल अपडेट की है http://pastebin.com/f3fb9d1d0 –