QT解析XML文件

来源:互联网 发布:成都 大数据 售前 编辑:程序博客网 时间:2024/05/22 11:54

QT解析XML文件

一.QT提供三种处理XML文件方式

DOM(DocumentObject Model):将整个 XML 文档读入内存,构建成一个树结构,允许程序在树结构上向前向后移动导航,这是与另外两种方式最大的区别,也就是允许实现多次解析器(对应于 QXmlStreamReader 的一次解析器)。DOM 方式带来的问题是需要一次性将整个 XML 文档读入内存,因此会占用很大内存,这样就使得它不适合处理较大的文件。DOM是由 W3C 提出的一种处理 XML 文档的标准接口

SAX(Simple API forXML):提供大量虚函数,以事件的形式处理 XML 文档。这种解析办法主要是由于历史原因提出的,为了解决 DOM 的内存占用提出的(在现代计算机上,这个一般已经不是问题了),它提供了比 DOM更简单的接口,并且它不需要将整个 XML 文档一次性读入内存,这样便可以用来读取较大的文件。SAX 方法只适用于读取 XML 文档

QXmlStreamReader: QXmlStreamReader 类提供了一个快速的解析器通过一个简单的流API 来读取格式良好的 XML文档,它是作为 Qt 的 SAX 解析器的替代品的身份出现的,特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一次性处理 XML 文档,期间不会有反复的情况,也就是不会读完第一个标签,然后读第二个,读完第二个又返回去读第一个,这是不允许的)。使用 QXmlStreamReader 是 Qt 中最快最方便的读取 XML 的方法。因为 QXmlStreamReader 使用了递增式的解析器,适合于在整个 XML 文档中查找给定的标签、读入无法放入内存的大文件以及处理 XML 的自定义数据。

 

二.代码

CSAXPARSE类

H文件

#ifndefCSAXPARSE_H

#defineCSAXPARSE_H

#include<QXmlDefaultHandler>

 

classCSAXParse:publicQXmlDefaultHandler

{

public:

    CSAXParse();

    voidSetXMLData(char*xmlData);

protected:

    boolstartElement(constQString&namespaceURI,

                      constQString&localName,

                      constQString&qName,

                      constQXmlAttributes&atts);

    boolendElement(constQString&namespaceURI,

                    constQString&localName,

                    constQString&qName);

    boolcharacters(constQString&ch);

    boolfatalError(constQXmlParseException&exception);

};

 

#endif//CSAXPARSE_H

CPP文件

#include"CSaxParse.h"

#include<QDebug>

 

CSAXParse::CSAXParse()

{

 

}

 

voidCSAXParse::SetXMLData(char*xmlData)

{

    QXmlInputSourceinput;

    QStringdata=xmlData;

    qDebug()<<data;

    input.setData(data);

 

    QXmlSimpleReaderreader;

    reader.setContentHandler(this);

    reader.setErrorHandler(this);

 

    boolbRet=reader.parse(&input);

    qDebug("CSAXParse::SetXMLData:bRet=%d",bRet);

}

 

boolCSAXParse::startElement(constQString&namespaceURI,

                            constQString&localName,

                            constQString&qName,

                            constQXmlAttributes&atts)

{   

    qDebug("startElement:%s",

           qName.toStdString().c_str());

}

 

boolCSAXParse::endElement(constQString&namespaceURI,constQString&localName,constQString&qName)

{

    if(qName=="")

    {

        returnfalse;

    }

    else

    {

        qDebug("endElement:%s",qName.toStdString().c_str());

        returntrue;

    }

}

 

boolCSAXParse::characters(constQString&ch)

{

    if(ch=="")

    {

        returnfalse;

    }

    else

    {

        qDebug()<<ch;

        returntrue;

    }

}

 

boolCSAXParse::fatalError(constQXmlParseException&exception)

{

    qDebug("Error:%s,line=%d,column=%d",

           exception.message().toStdString().c_str(),

           exception.lineNumber(),exception.columnNumber());

    returnfalse;

}

MAIN文件

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include<vector>

#include<math.h>

#include<qxmlstream.h>

#include<QDomDocument>

#include<QDebug>

#include"CSaxParse.h"

usingnamespacestd;

 

char*xmlExample=

"<?xmlversion=\"1.0\"encoding=\"UTF-8\"?>\

<message>\

    <code>0</code>\

    <content>\

        <item>\

            <id>1010000000000049055</id>\

            <pid>49055</pid>\

            <name>KLFDTCC</name>\

            <address>XYNL2H</address>\

            <displayLon>116.45972</displayLon>\

            <displayLat>39.94882</displayLat>\

            <lon>116.45971</lon>\

            <lat>39.94882</lat>\

        </item>\

    </content>\

</message>";

 

voidxmlDataStreamParse(constchar*xml)

{

    QXmlStreamReaderstreamxml(xml);

 

    while(!streamxml.atEnd()

          &&!streamxml.hasError())

    {

        QXmlStreamReader::TokenTypetoken=streamxml.readNext();

        if(token==QXmlStreamReader::StartDocument)

        {

            continue;

        }

 

        if(token==QXmlStreamReader::StartElement)

        {

            QStringReftemp=streamxml.name();

 

            if(streamxml.name()=="item")

            {

                qDebug("ParseStart:");

            }

            if(streamxml.name()=="name")

            {

                QStringname=streamxml.readElementText();

                qDebug("name->:%s",name.toStdString().c_str());

            }

 

            if(streamxml.name()=="address")

            {

                QStringaddress=streamxml.readElementText();

                qDebug("address->:%s",address.toStdString().c_str());

            }

            if(streamxml.name()=="displayLon")

            {

                QStringdisLon=streamxml.readElementText();

                qDebug("displayLon->:%s",disLon.toStdString().c_str());

            }

            if(streamxml.name()=="displayLat")

            {

                QStringdisLat=streamxml.readElementText();

                qDebug("displayLat->:%s",disLat.toStdString().c_str());

            }

        }

    }

}

 

voidxmlDataDomParse(constchar*xml)

{

    QDomDocumentdocument;

    QStringerror;

    intline=0;

    intcolum=0;

    QStringtext=xml;

    boolbRet=document.setContent(text,&error,&line,&colum);

    qDebug("bRet=%d",bRet);

    if(bRet==false)

    {

        return;

    }

    if(document.isNull())

    {

        qDebug("documentisnull");

        return;

    }

 

    //

    QDomElementroot=document.documentElement();

    QStringrootTagName=root.tagName();

    qDebug()<<rootTagName;

 

//    //方式一

//    QDomElementcode=root.firstChildElement();

//    QStringcodeTagName=code.tagName();

//    qDebug()<<codeTagName;

 

    //方式二

//    QDomNodeListnodeList=root.childNodes();

//    intnodeNum=nodeList.count();

//    qDebug("nodeNum=%d",nodeNum);

//    for(inti=0;i<nodeNum;i++)

//    {

//        QDomNodedomNode=nodeList.item(i);

//        QDomElementelement=domNode.toElement();

 

//        QDomNodeListchildList=element.childNodes();

//        intchildNum=childList.count();

 

//        for(intj=0;j<childNum;j++)

//        {

//            QDomNodeddomNode=childList.item(j);

//            QDomElementeElement=ddomNode.toElement();

 

//            QDomNodeListcChildList=eElement.childNodes();

//            intcChildNum=cChildList.count();

//            for(intm=0;m<cChildNum;m++)

//            {

//                QDomNodechildDomNode=cChildList.item(m);

//                QDomElementchildElement=childDomNode.toElement();

//                QStringchildTagName=childElement.tagName();

//                qDebug()<<childTagName;

//                QStringchildTagValue=childElement.text();

//                qDebug()<<childTagValue;

//            }

//        }

//    }

 

    //方式三

    QDomElementelement=root.firstChildElement();

    while(!element.isNull())

    {

        QStringtagName=element.tagName();

        QStringtagValue=element.text();

        qDebug()<<tagName<<tagValue;

        element=element.nextSiblingElement();

    }

}

 

intmain()

{

    cout<<"HelloWorld!"<<endl;

 

    //1.xmlstreamreaderparse

    qDebug("xmlstreamreaderparse");

//    xmlDataStreamParse(xmlExample);

    //2.xmldomdocumentparse

    qDebug("xmldomdocumentparse");

//    xmlDataDomParse(xmlExample);

    //3.xmlsaxparse

    CSAXParsesaxParse;

    saxParse.SetXMLData(xmlExample);

 

    return0;

}

 

 

0 0