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" );
}
}
}
}