【发布时间】:2011-10-11 04:19:04
【问题描述】:
完全用 Perl 编写的 XML-Parser 与只为像 GNOME 的 LibXML 这样的 Parser 提供接口的优点和缺点是什么?
【问题讨论】:
完全用 Perl 编写的 XML-Parser 与只为像 GNOME 的 LibXML 这样的 Parser 提供接口的优点和缺点是什么?
【问题讨论】:
专业版:更便携且更易于安装(您不需要针对 C 库编译纯 Perl 模块,它们可以在 perl 二进制文件运行的任何地方运行,您不需要 C 编译器和如果您想在任意机器上构建它,则需要链接的 dev- 库)。
缺点:与高度优化的 C 相比,纯 Perl(或任何动态语言)相对较慢。
【讨论】:
其实有几个;例如XML::SAX::PurePerl 和XML::Parser::Lite,但它们既慢又不完整:我上次检查 XML::SAX::PurePerl 时仍然有一些错误,尽管您可能在现实生活中找不到它们,而 XML:: Parser::Lite 应该只解析 SOAP 使用的 XML 子集。
在任何情况下,大多数系统都带有 expat 或 libxml2,因此在实践中依赖外部库似乎不是什么大问题。即使在 Windows 上 expat 也包含在 Activestate Perl 和 Strawberry Perl 中。
XML 解析器实际上非常复杂(您需要解析 XML,还需要解析 DTD,处理实体......)所以没有必要重新发明这个特定的轮子,除了娱乐^W学习目的。
【讨论】:
正如 mirod 所指出的,不完整有时是缺点。
如果您必须根据 XSD 架构验证 XML,情况可能会变得更糟。 有一些模块试图解决这个问题,例如XML::Compile 或XML::Pastor,但您必须对速度有所容忍。
为了给您一些数字,我将讨论我编写的一个 Perl 程序,用于验证必须符合模式的 XML 数据。我的程序使用 XML::Parser 和 MooseX::Types,并且可能需要 10 秒来验证 5 MiB 的 XML 文件。
另一边,
xmllint --schema /path_to/schema.xsd data.xml
在几分之一秒内完成相同的任务。
我在解析阶段使用VTD-XML 恢复了一些速度(和内存),但我仍然必须使用 Perl 验证数据,因为 VTD-XML 不是(仍然)一个验证解析器。
【讨论】: