posts - 36, comments - 30, trackbacks - 0, articles - 0

几种xml的parser分析

Posted on 2008-03-28 14:53 vcommon 阅读(2502) 评论(0)  编辑 收藏 引用

1:Expat xml parser(摘选),大概诞生于1999年,经典code
可以在許多平台使用,Expat是一個stream導向的parser library。
expat也有不少wrapper library,譬如Python、Perl、Tcl、C++....等等。
Expat使用callback function來處理狀態改變的動作,所以當你需要對某些tag做處理的時候你必須要設定相關的處理函式,這裡我們只對最簡單的型式做處理,因此我只設定start tag、end tag與default handler:
::XML_SetUserData(parser, this);
::XML_SetElementHandler(parser, expatStart, expatEnd);
::XML_SetDefaultHandler(parser, expatHandler);

http://www.codeproject.com/KB/XML/expatimpl.aspx c++ wrapper for Expat xml parser

2:XercesParser
Xerces
parser支持的方式很多,但是不易用。
CEGUI:#define CEGUI_DEFAULT_XMLPARSER XercesParser
add define CEGUI_WITH_XERCES

        XercesHandler xercesHandler(handler);

        // create parser
        SAX2XMLReader* reader = createReader(xercesHandler);

        try
        {
            // set up schema
            initialiseSchema(reader, schemaName, filename, resourceGroup);
            // do parse
            doParse(reader, filename, resourceGroup);
        }
3:微软的xml2,很好用,遍历效率不好说。
还是最流行的xml parser.

4:Tiny xml
感觉和微软的xml2很类似的说
// Parse the document
        CEGUITinyXML::TiXmlDocument doc;
        doc.Parse((const char*)buf);
        const CEGUITinyXML::TiXmlElement* currElement = doc.RootElement();
        if (currElement)
        {
            // function called recursively to parse xml data
            processElement(currElement);
        }



//

DOM,这是W3C的标准模型,它将XML的结构信息以树形的方式构建,提供了遍历这颗树的接口与方法。
SAX,一种低级的parser,逐元素的向前只读处理,不含有结构信息。
以上两种选择都各有利弊,但是都不是特别好的解决方案,它们的优缺点如下:

DOM

优点:易用性强,因为所有的XML结构信息都存在于内存中,并且遍历简单,支持XPath。
缺点:Parsing速度太慢,内存占用过高(原文件的5x~10x),对于大文件来说几乎不可能使用。
SAX

优点:Parsing速度快,内存占用不与XML的大小相联系(可以做到XML涨内存不涨)。
缺点:易用性差,因为没有结构信息,并且无法遍历,不支持XPath。如果需要结构的话只能读一点构造一点,这样的可维护性特别的差。
我们可以看出,基本上DOM与SAX是正好相反的两个极端,但是任何一个都不能很好的满足我们的大部分要求,我们需要找出另外一种处理方法来。注意XML的效率问题并不是XML本身的问题,而是处理XML的Parser的问题,就像我们在上面看到的两种方法有不同的效率权衡一样。


所谓的extractive parsing就是说在解析XML时,DOM或SAX会提取一部分原文件(一般来说是一个字符串),然后在内存中进行解析构建(输出自然就是一个或一些对象了)。
DOM与SAX都是extractive parsing模式,这种解析模式注定了DOM与SAX都需要大量的创建(销毁)对象,引起效率问题。

最新有一种VTD-xml parser的模式,类似于 解析2进制的视频流的快进快退
就像大多数好的产品一样,VTD-XML的原理并不复杂,而是很巧妙。为了实现non-extractive这个目的,它将原XML文件原封不动的以二进制的方式读进内存,连解码都不做,然后在这个byte数组上解析每个element的位置并把一些信息记录下来,之后的遍历操作便在这些保存下来的record上进行。

VTD-XML的record机制就叫做VTD(Virtual Token Descriptor),VTD将性能瓶颈在tokenization阶段就解决掉了真的是很巧妙很用心的做法。VTD是一个64bits长度的数值类型,记录了每个element的起始位置(offset),长度(length),深度(depth)以及token的类型(type)等信息。


只有注册用户登录后才能发表评论。