2009-08-06 11 views

Antwort

16

Verwenden von XPath-Ausdrücken

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

Und lesen Sie Dokumentation, natürlich :)

+2

Und natürlich, wenn Sie das DOM selbst gehen wollen, können Sie das auch tun. XML :: LibXML verwendet die W3C-DOM-API, die dieselbe ist, die Sie in Javascript verwenden. Also sollte es leicht bekannt sein (obwohl die API nicht schlecht ist, zumindest ist es Standard). – jrockway

+0

danke. Wie kann man den Wert für string2 ändern? – Anandan

+6

@Anandan schreiben 'teme' statt 'sag mir' ist nicht cool. In der Tat, es bringt einige Leute wie mich, die zusätzliche Anstrengung in mental analysieren müssen, was Sie sagen. Die Qualität der Antworten, die Sie als Antwort auf Ihre Fragen erhalten, ist direkt proportional zu dem Aufwand, den Sie in klare, klar definierte Fragen investieren. –

8

Sie XML verwenden könnte :: Parser als auch den Wert zu erhalten. Für weitere Informationen siehe zum 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

Ich glaube, Sie könnten mit XML::Simple besser dran beginnen und spielen um ein wenig zuerst:

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

Oberflächlich sieht einfach aus, aber xml :: einfache Datenstrukturen essen Speicher für große Dokumente, und das Gehen wird wirklich sehr schnell kryptisch. – singingfish

+0

@singingfish Werfen Sie einen Blick auf den Beitrag des OPs. Er weiß nicht genug, um mit dem Lernen der anderen Bibliotheken beginnen zu können. Er muss etwas tun, um etwas zu lernen, damit er auf die Bühne kommen kann, wo er weiß, was Sie in Ihrem Kommentar meinen. –