XML 解析是有点复杂,如果想用个简单的接口, XML::Simple 不错

还是写个 XML::LibXML::SAX 的例子吧:
以下代码放在一个文件中,建议阅读 XML::SAX::Base 和 http://perl-xml.sourceforge.net/:

package SAXHandler;

use Data::Dumper;

use parent 'XML::SAX::Base';


> sub new { bless {tag => $_[1]}, $_[0] }


> sub start_element {

my ($self, $elm) = @_;


> if ($elm->{'LocalName'} eq $self->{'tag'}) {


> my $attrs = $elm->{'Attributes'};


> for $key (keys %{$attrs}) {

print "$attrs->{$key}{'Value'}\t" if $attrs->{$key}{'Name'} eq "ctime";

}


> $self->{'output'} = 1;

 }

}


> sub characters {

my ($self, $char) = @_;

print "$char->{'Data'}\n" if $self->{'output'};

$self->{'output'} = 0;

}


> package main;


> use XML::LibXML::SAX;


> my $sax = XML::LibXML::SAX->new(Handler => SAXHandler->new($ARGV[0]));

$sax->parse_string(<<XML);

<?xml version="1.0"?>

<categories>

<aaa>bbb</aaa>

<category ctime="1284224672">cat_1</category>

<category ctime="1284224676">cat_2</category>

<category ctime="1284224670">cat_8</category>

<category ctime="1284224678">cat_5</category>

</categories>


> XML



要满足你的需求,基本上改动一下就好了吧, parse_string 改成 parse_file(FILENAME);


2010/9/11 cnhack TNT <[email protected]>

> $parser = XML::LibXML::SAX->new();
>
> 不客气~
>
> 2010/9/11 zhang jiaqiang <[email protected]>
>
> 多谢cnhack TNT!
>>
>> 关于XML::LibXML::SAX 能多给点提示么?搞不太清楚怎么使用,文档写得好“简易”啊。
>>
>> *不过我试用了XML::LibXML,处理相同的文件,从90秒降到了8秒!*
>>
>>
>> #!/usr/bin/perl
>>
>> use strict;
>> use XML::LibXML;
>> use Benchmark;
>>
>> my $start = new Benchmark;
>>
>>
>> my $file = $ARGV[0];
>> my $parser = XML::LibXML->new();
>> my $tree = $parser->parse_file($file);
>> my $root = $tree->getDocumentElement;
>> my @specEle = $root->getElementsByTagName($ARGV[1]);
>>
>> foreach my $eid (@specEle) {
>>     my $oexid = $eid->getAttribute('id');
>>     print "oexid $oexid \n";
>> }
>>
>> my $end = new Benchmark;
>> my $diff = timediff( $end, $start );
>> # report
>> print "Time taken was ", timestr( $diff, 'all' ), " seconds\n";
>>
>>
>>
>>
>> 2010/9/10 cnhack TNT <[email protected]>
>>
>>> 用 XML::LibXML::SAX 好了
>>>
>>>
>>> 2010/9/10 ZHANG Jiaqiang A <[email protected]>
>>>
>>>  请教一下,目标还比较简单,就是从xml文件中抽取某类element的某个固定的attr的值,我用perl的XML::Parser模块写了一下,
>>>> 耗时90秒。
>>>>
>>>> 希望能大幅度地提高一下效率,想听听大家有啥建议?
>>>>
>>>> (试了一下XML::Twig模块,可能是我用的不得法,相同的功能用了190秒)
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
>>>> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
>>>> 要取消订阅此网上论坛,请发送电子邮件至 
>>>> [email protected]<perlchina%[email protected]>
>>>> 。
>>>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>>>>
>>>
>>>  --
>>> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
>>> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
>>> 要取消订阅此网上论坛,请发送电子邮件至 
>>> [email protected]<perlchina%[email protected]>
>>> 。
>>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>>>
>>
>>  --
>> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
>> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
>> 要取消订阅此网上论坛,请发送电子邮件至 
>> [email protected]<perlchina%[email protected]>
>> 。
>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>>
>
>

-- 
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 [email protected]。
要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

回复