还是写个 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 <cnhacktnt@gmail.com>
$parser = XML::LibXML::SAX->new();不客气~2010/9/11 zhang jiaqiang <zhangjiaqiang@gmail.com>
多谢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 <cnhacktnt@gmail.com>用 XML::LibXML::SAX 好了2010/9/10 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
--请教一下,目标还比较简单,就是从xml文件中抽取某类element的某个固定的attr的值,我用perl的XML::Parser模块写了一下,耗时90秒。希望能大幅度地提高一下效率,想听听大家有啥建议?(试了一下XML::Twig模块,可能是我用的不得法,相同的功能用了190秒)
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
没有评论:
发表评论