perl XML模块

perl解析XML实现方式有很多模块。下面总结一些。


模块 说明
XML::Simple 用于读写 XML 的普通 API,最好与 XML 格式的配置文件一起使用
XML::LibXML gnome libxml2 库的 Perl 接口,用于高性能的 DOM 处理
XML::Parser 用于 James Clark 的 XML 语法分析器 expat 的Perl 接口
XML::XPath XPath 规范的完整实现
XML::DOM XML::Parser 的 Perl 扩展,构建面向对象的数据结构并具有遵从 DOM 级别 1 的接口, 作为 libxml-enno 的一部分分发
XML::Grove 使用 Perl 散列树对已分析的 XML、HTML 或 SGML 实例组成的信息集进行简单访问
XML::Twig XML 文档的树型接口,允许对超大型文档一段段地处理
libxml-perl Perl 模块、脚本和文档的集合,用于在 Perl 中使用 XML, libxml-perl 软件与 XML::Parser、PerlSAX、XML::DOM、XML::Grove 等一起工作
XML::Schematron 基于 XSLT 的 XML 验证模块
Orchard 用于 XML 和 XML 表示的数据的事件流和树型视图的轻量级 API
Xerces Perl “Apache XML 项目”中的 Xerces XML 语法分析器的 Perl 接口
REX 对有常规表达式的 XML 文档进行初步分析
PYX 至 PYX 生成器的 XML

性能比较

CPU: Intel(R) Xeon(R) CPU E5-2603 0 @ 1.80GHz
MEM: 2G
系统: Centos 6.3
测试集: 有10万行的xml或者json,每个xml/json的大小在2k-3k.
perl解析速度和python,c++做了对比.

环境 模块 数据 耗时(秒) 速度(个/秒)
Perl v5.10.1 XML::Simple 10w 3k-XML 2000 50
Perl v5.10.1 XML::LibXML  10w 3k-XML 57 1754
Perl v5.10.1 JSON 10w 3k-JSON 764 130
Python 2.6.6 xml.dom 10w 3k-XML 632 158
Python 2.6.6 json 10w 3k-JSON 415 240
C++ jsoncpp jsoncpp 10w 3k-JSON 29 3448

XML::LibXML编程示例

可见使用XML::LibXML将获得不错的解析性能,实质上在底层它使用的是libxml2.

#!/usr/bin/perl

use XML::LibXML;

sub parse_xml() {
    debug_print( ( caller(0) )[3] . "> \n" ) if ( $option{d} );
    my $doc = undef;

    my $text_ref = undef;

    # catch xml exception
    eval {
        $doc = XML::LibXML->load_xml( string => $_ );
        1;
    } or do {
        my $err = $@;
        debug_print( ( caller(0) )[3] . "> $err\n" );
    };

    if ($doc) {
        #e.g. node "meta"
        foreach my $node ( $doc->findnodes('/meta') ) {
            foreach my $child ( $node->childNodes ) {
                my $data = $child->toString;
                debug_print( ( caller(0) )[3] . "> $data\n" );
            }
        }
    }
}


Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐