2014-10-02 83 views
1

我正在解析一个XML文件,并且该文件具有这样的节点。XML :: Parser打印单个属性值

<product id="12345" model="dvd" section="cmp" img="junk.jpg"></product> 

这是我的代码。我需要打印所有产品的id属性的值。

use XML::Parser; 
my $parser = XML::Parser->new(Handlers => { Start => \&handle_start }); 
$parser->parsefile('D:\Project\mob.xml'); 

sub handle_start { 
    my ($expat, $element, %attrs) = @_; 
    if ($element eq 'product') { 
     print $element; 
    } 
} 

回答

3

既然你在%attrs哈希id,你只需要打印:

sub handle_start { 
    my ($expat, $element, %attrs) = @_; 
    if ($element eq 'product') { 
     print $attrs{id}, "\n"; 
    } 
} 

XML::Parser是低级语法分析器。如果您会考虑使用一个具有更复杂的API,尝试XML::Twig

use warnings; 
use strict; 
use XML::Twig; 

my $xml = <<XML; 
<product id="12345" model="dvd" section="cmp" img="junk.jpg"></product> 
XML 

my $twig = XML::Twig->new(
    twig_handlers => { product => sub { print $_->att('id'), "\n" } }, 
); 
$twig->parse($xml); 
+1

XML ::的libxml:'说_- $>以$ doc-> findnodes( '//产品/ @ ID')值; ' – ikegami 2014-10-02 17:51:18

+1

XML :: Twig仍然是我首选的XML处理模式之一。 – Sobrique 2014-10-02 18:25:21