2009-08-06 109 views

回答

16

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

和阅读文档,当然:)

+2

当然,如果你想自己走DOM,你也可以这样做。 XML :: LibXML使用W3C DOM API,这与您在Javascript中使用的API相同。所以它应该很容易熟悉(尽管API确实很糟糕,至少它是标准的)。 – jrockway 2009-08-07 04:26:12

+0

谢谢。你能告诉我如何改变string2的值吗? – Anandan 2009-08-07 06:23:34

+6

@Anandan写'temme'而不是'告诉我'并不酷。事实上,它让一些像我这样的人不得不花费精力来解释你所说的话。您回答问题的答案的质量与您在撰写清晰明确的问题时付出的努力成正比。 – 2009-08-07 14:34:31

8

你可以使用XML解析器::获得价值以及。欲了解更多信息,请参阅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

我想你可能会更好开始XML::Simple和周围有点第一弹:

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

表面上看起来很简单,但xml ::简单的数据结构吃大的文件的内存,真的很快就会变得很神秘。 – singingfish 2009-08-08 02:18:43

+0

@singingfish再次看看OP的帖子。他不知道能够开始学习其他图书馆。他需要*做一点*学习*一些*,以便他能够到达他知道你的评论意思的阶段。 – 2009-08-08 02:24:24

相关问题