2009-08-06 34 views

Respuesta

16

Uso expresiones 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);        

Y leer la documentación, por supuesto :)

+2

Y por supuesto, si quiere caminar con el DOM usted mismo, puede hacerlo también. XML :: LibXML usa la API DOM de W3C, que es la misma que usas en Javascript. Por lo tanto, debería ser fácilmente familiar (aunque la API es mala, al menos es estándar). – jrockway

+0

gracias. ¿Cómo puedes cambiar el valor de string2? – Anandan

+6

@Anandan escribiendo 'temme' en lugar de 'dime' no es genial. De hecho, desilusiona a algunas personas, como yo, que tienen que esforzarse más para analizar mentalmente lo que estás diciendo. La calidad de las respuestas que recibe en respuesta a sus preguntas es directamente proporcional al esfuerzo que realiza al redactar preguntas claras y bien definidas. –

8

Se podría utilizar XML :: Parser para obtener el valor también. Para obtener más información consulte la 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

creo que podría ser mejor comenzar con XML::Simple y jugando un poco en primer lugar:

#!/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

Superficialmente parece simple, pero las estructuras de datos xml :: simples comen memoria para documentos grandes, y las cosas se vuelven realmente crípticas realmente rápidamente. – singingfish

+0

@singingfish Eche un vistazo a la publicación de OP nuevamente. Él no sabe lo suficiente como para poder comenzar a aprender las otras bibliotecas. Él tiene que * hacer * un poco para aprender * algo * para poder llegar a la etapa en la que sabe a qué te refieres en tu comentario. –

Cuestiones relacionadas