2009-08-06 8 views

risposta

16

Usa espressioni XPath

use strict;                              
use warnings;                              

use XML::LibXML;                             
use Data::Dumper;                             

my $doc = XML::LibXML->new->parse_string(q{                      
<PARENT>                               
    <TAG string1="asdf" string2="asdfd">                       
    </TAG>                              
</PARENT>                               
});                                

my $xpath = '/PARENT/TAG/@string2';                        
# getting value of attribute:                          
print Dumper $doc->findvalue($xpath);                        
my ($attr) = $doc->findnodes($xpath);                        

# setting new value:                            
$attr->setValue('dfdsa');                           
print Dumper $doc->findvalue($xpath);                        

# do following if you need to get string representation of your XML structure 
print Dumper $doc->toString(1);        

E leggere la documentazione, ovviamente :)

+2

E, naturalmente, se vuoi percorrere il DOM da solo, puoi farlo anche tu. XML :: LibXML utilizza l'API DOM W3C, che è la stessa utilizzata in Javascript. Quindi dovrebbe essere prontamente familiare (anche se l'API fa schifo, almeno è standard). – jrockway

+0

grazie. puoi dirmi come cambiare il valore per string2 ?? – Anandan

+6

@Anandan scrivere 'temme' invece di 'dirmi' non è bello. In effetti, spaccia alcune persone, come me, che devono impegnarsi ulteriormente per analizzare mentalmente quello che stai dicendo. La qualità delle risposte che ottieni in risposta alle tue domande è direttamente proporzionale allo sforzo che componi nel comporre domande chiare e ben definite. –

8

Si potrebbe utilizzare XML :: Parser per ottenere il valore come bene. Per ulteriori informazioni consultare il XML::Parser documentation:

#!/usr/local/bin/perl 
use strict; 
use warnings; 


use XML::Parser; 
use Data::Dumper; 

my $attributes = {}; 

my $start_handler = sub 
{ 
    my ($expat, $elem, %attr) = @_; 
    if ($elem eq 'TAG') 
    { 
     $attributes->{$attr{'string1'}} = 'Found'; 
    } 
}; 


my $p1 = new XML::Parser(
     Handlers => { 
      Start => $start_handler 
     } 
); 

$p1->parsefile('test.xml'); 

print Dumper($attributes); 
2

penso che si potrebbe essere meglio a cominciare XML::Simple e giocare un po 'prima:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Simple; 

my $xml = XMLin(\*DATA); 

print $xml->{TAG}->{string2}, "\n"; 

$xml->{TAG}->{string2} = "asdf"; 

print XMLout($xml, RootName => 'PARENT'); 

__DATA__ 
<PARENT> 
<TAG string1="asdf" string2="value of string 2"> 
</TAG> 
</PARENT> 
+1

Sembra superficialmente semplice, ma xml :: le semplici strutture di dati consumano memoria per documenti di grandi dimensioni e il gioco diventa davvero criptico molto rapidamente. – singingfish

+0

@singingfish Dai un'occhiata al post dell'OP. Non sa abbastanza per essere in grado di iniziare a imparare le altre librerie. Deve * fare * un po 'per imparare * alcuni * in modo che possa arrivare al punto in cui sa cosa intendi nel tuo commento. –

Problemi correlati