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 访问此网上论坛。
