2009-08-06 6 views

cevap

16

Kullanım XPath elbette

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

Ve okumak belgelerine ifadelerde :)

+2

Ve tabi ki, DOM'u kendiniz yürümek isterseniz, bunu da yapabilirsiniz. XML :: LibXML, Javascript'te kullandığınız W3C DOM API'sini kullanır. Bu nedenle, (ALF, en azından standart olan bir emici olsa da) tanıdık olmalıdır. – jrockway

+0

teşekkürler. string2 değerini nasıl değiştirebilirim? – Anandan

+6

@Anandan 'bana' yerine 'temme' yazmak bana göre havalı değil. Aslında, söylediklerinizi zihinsel olarak ayrıştırmak için fazladan çaba sarfetmek zorunda olan kendim gibi bazı insanları ortaya koyar. Sorularınıza yanıt olarak aldığınız cevapların kalitesi, net ve iyi tanımlanmış sorular oluşturmaya harcadığınız çabayla doğrudan orantılıdır. –

8

Siz de değeri elde etmek XML :: Ayrıştırıcı kullanabilirsiniz. Daha fazla bilgi için XML::Parser documentation bakınız:

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

Sana XML::Simple ile başlayan ve biraz ilk uğraşırken daha iyi olabileceğini düşünüyorum:

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

Yüzeysel olarak basit görünüyor, ancak xml :: basit veri girişimleri büyük belgeler için bellek tüketiyor ve gidiş gerçekten çok hızlı bir şekilde şifreleniyor. – singingfish

+0

@singingfish OP'nin mesajına tekrar göz atın. Diğer kütüphaneleri öğrenmeye başlayabilecek kadar bilgi sahibi değil. Yapması gereken bir şey * öğrenmesi için birazcık * öğrenir * böylece yorumunuzda ne demek istediğini bildiği sahneye gidebilir. –

İlgili konular