最优雅的XML解析器TinyXML

    From: xuyibo.net  Updated: 2021-06-02

    邮件通知当更新时自动发送邮件通知。
    评论本文有什么建议或评论,可以贴一下。
    我要捐助你的支持,让我们做的更好。

    用过微软的MSXML的用户一定厌烦其COM固有的烦人的特性,虽然MSXML非常出色,但我总不愿意在自己写的小巧的程序中嵌入这么庞大的一个家伙,这不是我风格。而apache的xerces-c更是让我汗颜,写软件能写成这样,我只能望洋兴叹,望尘莫及…而微软新出的XmlLite,依旧不能脱离其COM(讨厌的COM,让我不能小巷子赶猪)。而TinyXML却是我目前见过的最好的XML解析器,虽然有些缺点,而这些却是作者Lee Thomason, Yves Berquin, Andrew Ellerton们有意这么设计的。

  1. 特点
  2. ×最快的解析器
    TinyXML实现非常精简、优雅。当我看其源码的时候,我就在和suofanker说,即使是我,再锻炼三年,也不一定能写出这样的代码。灵活、简单、强大,这些都是我在设计一个软件时考虑的最重要的因素,TinyXML都做到了。

    基于DOM的XML操作
    TinyXML只实现了最基本的基于DOM的XML操作,对于结点数据,TinyXML没有做任何编码变换,比如一个UTF-8的xml,TinyXML读取后,不会将UTF-8的字符转换为GB2312,这些都留给了用户。对于美国人,他们可以happy到很,26个英文字母,不用担心任何的编码转换问题。

    C++实现的
    C语言实现一个类似的不是不可能,但实现起来可能就没有现在这样这么优雅。

  3. 实现
  4. 主引擎

    TiXmlDocument::Parse函数实现的,从TiXmlDocument继承的所有类都实现了Parse函数。
    while (p && *p) {
        TiXmlNode* node = Identify(p, encoding);
        if (node) {
            p = node->Parse(p, &data;, encoding);
            LinkEndChild(node);
        } else {
            break;
        }
        // ...
        p = SkipWhiteSpace(p, encoding);
    }
    

    特有的string buffer处理机制
    每次需要字符串处理的时候,TiXmlString负责这件事情,TiXmlString通过分配一个头数据和需要的字符串长度那么大小的缓冲区,然后返回这块缓冲区给内部或外部做进一步处理。

  5. 相关文章
  6. 微软新的XML API – XmlLite
    MSXML使用教程
    expat教程

  7. 评论本文:
  8. EMail: