2010年9月11日星期六

Re: [PerlChina] 解析比较大的xml文件

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

没有评论: