perl XML模块

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


模块说明
XML::Simple用于读写 XML 的普通 API,最好与 XML 格式的配置文件一起使用
XML::LibXMLgnome libxml2 库的 Perl 接口,用于高性能的 DOM 处理
XML::Parser用于 James Clark 的 XML 语法分析器 expat 的Perl 接口
XML::XPathXPath 规范的完整实现
XML::DOMXML::Parser 的 Perl 扩展,构建面向对象的数据结构并具有遵从 DOM 级别 1 的接口, 作为 libxml-enno 的一部分分发
XML::Grove使用 Perl 散列树对已分析的 XML、HTML 或 SGML 实例组成的信息集进行简单访问
XML::TwigXML 文档的树型接口,允许对超大型文档一段段地处理
libxml-perlPerl 模块、脚本和文档的集合,用于在 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.1XML::Simple10w 3k-XML200050
Perl v5.10.1XML::LibXML 10w 3k-XML571754
Perl v5.10.1JSON10w 3k-JSON764130
Python 2.6.6xml.dom10w 3k-XML632158
Python 2.6.6json10w 3k-JSON415240
C++ jsoncppjsoncpp10w 3k-JSON293448

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

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

更多推荐