2012-05-30 9 views
5

एक्सएमएल:xpath एक्सप्रेशन() लौटने खाली nodelist

<zoo xmlns="http://www.zoo.com" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.zoo.com employee.xsd"> 

<area id="1" posizione="nord" nome="scimmie"> 
    <animale> 
     <nome>Gigi</nome> 
     <sesso>Male</sesso> 
     <eta>3</eta> 
    </animale> 

    <animale> 
     <nome>Gigia</nome> 
     <sesso>Female</sesso> 
     <eta>2</eta> 
    </animale> 
</area> 

<area id="2" posizione="nord" nome="giraffe"> 
    <animale> 
     <nome>Giro</nome> 
     <sesso>Male</sesso> 
     <eta>6</eta> 
    </animale> 

    <animale> 
     <nome>Gira</nome> 
     <sesso>Female</sesso> 
     <eta>5</eta> 
    </animale> 
</area> 
</zoo> 

कोड:

my $parser = XML::LibXML->new; 
my $doc = $parser->parse_file("../xml/animals.xml"); 
my $root = $doc->getDocumentElement(); 

my $new_animal = $doc->createElement("animale"); 

my $name_element = $doc->createElement("nome"); 
$name_element->appendTextNode($name); 

my $gender_element = $doc->createElement("sesso"); 
$gender_element->appendTextNode($gender); 

my $age_element = $doc->createElement("eta"); 
$age_element->appendTextNode($age); 

$new_animal->appendChild($name_element); 
$new_animal->appendChild($gender_element); 
$new_animal->appendChild($age_element); 

my $area_element = $root -> findnodes("//area[\@id=$area]")->get_node(1); 

$area_element->appendChild($new_animal); 

$ क्षेत्र एक ऐसा क्षेत्र की आईडी है (आमतौर पर 1 अब है कि मैं परीक्षण कर रहा हूँ)

मेरा उद्देश्य एक नया जानवर बनाना है और इसे उचित क्षेत्र में जोड़ने के लिए

लेकिन मुझे समस्या है कि istructio n

my $area_element = $root -> findnodes("//area[\@id=$area]")->get_node(1); 

काम नहीं करेगा, क्योंकि $ area_element undef है, क्योंकि findnodes हमेशा एक खाली nodelist रिटर्न (आकार (मुद्रण जाँच))।

मुझे लगता है कि समस्या findnodes के अंदर xpath अभिव्यक्ति है, लेकिन मुझे समझ में नहीं आता कि क्या गलत है, मैं एक ही पुस्तकालय (एक्सएमएल :: XPath) के साथ एक ही अभिव्यक्ति का उपयोग करता हूं और यह काम कर रहा है।

क्या गलत है?

उत्तर

4

आपके एक्सएमएल में बहरे नामस्थान के लिए यूआरआई http://www.zoo.com है, इसलिए आपको इसे अपने एक्सपैथ एक्सप्रेशन में नोड्स के लिए निर्दिष्ट करना होगा।

ऐसा करने का तरीका XML::LibXML::XPathContext ऑब्जेक्ट घोषित करना है जो इस नामस्थान को नाम निर्दिष्ट करता है। नाम का उपयोग नोड्स तक पहुंचने के लिए XPath अभिव्यक्तियों में किया जा सकता है।

आप

my $xpc = XML::LibXML::XPathContext->new; 
$xpc->registerNs('zoo', 'http://www.zoo.com'); 

लिखते हैं तो अब आप एक संदर्भ है जिसमें एक्सएमएल के डिफ़ॉल्ट नाम स्थान zoo नामित किया गया है। अब आप

my $area_element = $xpc->findnodes("//zoo:area[\@id=$area]", $doc)->get_node(1); 

लिख सकते हैं और आप सही <area> तत्व मिल जाएगा।

+0

मैंने आपके कोड के साथ प्रयास किया, लेकिन मुझे यह मिलता है: ---------- सॉफ़्टवेयर त्रुटि: XPathContext: /Users/toyo/Sites/zoo/cgi-bin/_nuovo_animale.cgi लाइन पर वर्तमान नोड खो गया 76 --------- लाइन 76 है: मेरा $ area_element = $ xpc -> findnodes ("// zoo: area [\ @ id = $ area]") -> get_node (1); – qwertoyo

+0

@qwertoyo, यह एक नई समस्या है, और यहां पर चर्चा करने के लिए वास्तव में कोई जगह नहीं है। कृपया एक नया प्रश्न पूछें, और समस्या का प्रदर्शन करने के लिए आवश्यक न्यूनतम रननेबल कोड प्रदान करें। – ikegami

+0

@qwertoyo, सरल प्रयास करें: 'मेरा ($ area_element) = $ xpc-> findnodes ("// zoo: area [\ @ id = $ area]", $ doc); ' – ikegami

-2

नामस्थान घोषणा गलत है, इसे <zoo xmlns:zoo="http://www.zoo.com" या जैसा कहना चाहिए।

+0

'xmlns =" ​​http://www.zoo.com "' नामस्थान आईडी के बिना * केवल * डिफ़ॉल्ट * नेमस्पेस को बांधता है, यानी उन सभी तत्वों के लिए नेमस्पेस जो उपसर्ग नहीं लेते हैं। यदि डिफ़ॉल्ट नामस्थान की कोई परिभाषा नहीं है तो ऐसा लगता है कि एक घोषणा 'xmlns = "" 'का उपयोग किया गया था। – Borodin

+0

'' और '> सही और समकक्ष हैं (मानते हैं कि बच्चे उपसर्ग की कमी/उपस्थिति की नकल करते हैं)। '> में परिभाषित नामस्थान का उपयोग कभी नहीं किया जाता है, इसलिए आपकी सलाह गलत है। – ikegami

+0

गलत जवाब। नेमस्पेस घोषणा के साथ कुछ भी गलत नहीं है। Downvoting। –