QT解析XML文件

前端之家收集整理的这篇文章主要介绍了QT解析XML文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_0@QT解析XML文件

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

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

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

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

@H_403_0@

@H_403_0@二.代码

@H_403_0@CSAXPARSE类

@H_403_0@H文件

@H_403_0@#ifndefCSAXPARSE_H

@H_403_0@#defineCSAXPARSE_H

@H_403_0@#include<QXmlDefaultHandler>

@H_403_0@

@H_403_0@classCSAXParse:publicQXmlDefaultHandler

@H_403_0@{

@H_403_0@public:

@H_403_0@ CSAXParse();

@H_403_0@ voidSetXMLData(char*xmlData);

@H_403_0@protected:

@H_403_0@ boolstartElement(constQString&namespaceURI,

@H_403_0@ constQString&localName,

@H_403_0@ constQString&qName,

@H_403_0@ constQXmlAttributes&atts);

@H_403_0@ boolendElement(constQString&namespaceURI,

@H_403_0@ constQString&qName);

@H_403_0@ boolcharacters(constQString&ch);

@H_403_0@ boolfatalError(constQXmlParseException&exception);

@H_403_0@};

@H_403_0@

@H_403_0@#endif//CSAXPARSE_H

@H_403_0@CPP文件

@H_403_0@#include"CSaxParse.h"

@H_403_0@#include<QDebug>

@H_403_0@

@H_403_0@CSAXParse::CSAXParse()

@H_403_0@{

@H_403_0@

@H_403_0@}

@H_403_0@

@H_403_0@voidCSAXParse::SetXMLData(char*xmlData)

@H_403_0@{

@H_403_0@ QXmlInputSourceinput;

@H_403_0@ QStringdata=xmlData;

@H_403_0@ qDebug()<<data;

@H_403_0@ input.setData(data);

@H_403_0@

@H_403_0@ QXmlSimpleReaderreader;

@H_403_0@ reader.setContentHandler(this);

@H_403_0@ reader.setErrorHandler(this);

@H_403_0@

@H_403_0@ boolbRet=reader.parse(&input);

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

@H_403_0@}

@H_403_0@

@H_403_0@boolCSAXParse::startElement(constQString&namespaceURI,

@H_403_0@ constQString&localName,

@H_403_0@ constQString&qName,

@H_403_0@ constQXmlAttributes&atts)

@H_403_0@{

@H_403_0@ qDebug("startElement:%s",

@H_403_0@ qName.toStdString().c_str());

@H_403_0@}

@H_403_0@

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

@H_403_0@{

@H_403_0@ if(qName=="")

@H_403_0@ {

@H_403_0@ returnfalse;

@H_403_0@ }

@H_403_0@ else

@H_403_0@ {

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

@H_403_0@ returntrue;

@H_403_0@ }

@H_403_0@}

@H_403_0@

@H_403_0@boolCSAXParse::characters(constQString&ch)

@H_403_0@{

@H_403_0@ if(ch=="")

@H_403_0@ {

@H_403_0@ returnfalse;

@H_403_0@ }

@H_403_0@ else

@H_403_0@ {

@H_403_0@ qDebug()<<ch;

@H_403_0@ returntrue;

@H_403_0@ }

@H_403_0@}

@H_403_0@

@H_403_0@boolCSAXParse::fatalError(constQXmlParseException&exception)

@H_403_0@{

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

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

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

@H_403_0@ returnfalse;

@H_403_0@}

@H_403_0@MAIN文件

@H_403_0@#include<iostream>

@H_403_0@#include<stdio.h>

@H_403_0@#include<stdlib.h>

@H_403_0@#include<vector>

@H_403_0@#include<math.h>

@H_403_0@#include<qxmlstream.h>

@H_403_0@#include<QDomDocument>

@H_403_0@#include<QDebug>

@H_403_0@#include"CSaxParse.h"

@H_403_0@usingnamespacestd;

@H_403_0@

@H_403_0@char*xmlExample=

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

@H_403_0@<message>\

@H_403_0@ <code>0</code>\

@H_403_0@ <content>\

@H_403_0@ <item>\

@H_403_0@ <id>1010000000000049055</id>\

@H_403_0@ <pid>49055</pid>\

@H_403_0@ <name>KLFDTCC</name>\

@H_403_0@ <address>XYNL2H</address>\

@H_403_0@ <displayLon>116.45972</displayLon>\

@H_403_0@ <displayLat>39.94882</displayLat>\

@H_403_0@ <lon>116.45971</lon>\

@H_403_0@ <lat>39.94882</lat>\

@H_403_0@ </item>\

@H_403_0@ </content>\

@H_403_0@</message>";

@H_403_0@

@H_403_0@voidxmlDataStreamParse(constchar*xml)

@H_403_0@{

@H_403_0@ QXmlStreamReaderstreamxml(xml);

@H_403_0@

@H_403_0@ while(!streamxml.atEnd()

@H_403_0@ &&!streamxml.hasError())

@H_403_0@ {

@H_403_0@ QXmlStreamReader::TokenTypetoken=streamxml.readNext();

@H_403_0@ if(token==QXmlStreamReader::StartDocument)

@H_403_0@ {

@H_403_0@ continue;

@H_403_0@ }

@H_403_0@

@H_403_0@ if(token==QXmlStreamReader::StartElement)

@H_403_0@ {

@H_403_0@ QStringReftemp=streamxml.name();

@H_403_0@

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

@H_403_0@ {

@H_403_0@ qDebug("ParseStart:");

@H_403_0@ }

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

@H_403_0@ {

@H_403_0@ QStringname=streamxml.readElementText();

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

@H_403_0@ }

@H_403_0@

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

@H_403_0@ {

@H_403_0@ QStringaddress=streamxml.readElementText();

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

@H_403_0@ }

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

@H_403_0@ {

@H_403_0@ QStringdisLon=streamxml.readElementText();

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

@H_403_0@ }

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

@H_403_0@ {

@H_403_0@ QStringdisLat=streamxml.readElementText();

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

@H_403_0@ }

@H_403_0@ }

@H_403_0@ }

@H_403_0@}

@H_403_0@

@H_403_0@voidxmlDataDomParse(constchar*xml)

@H_403_0@{

@H_403_0@ QDomDocumentdocument;

@H_403_0@ QStringerror;

@H_403_0@ intline=0;

@H_403_0@ intcolum=0;

@H_403_0@ QStringtext=xml;

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

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

@H_403_0@ if(bRet==false)

@H_403_0@ {

@H_403_0@ return;

@H_403_0@ }

@H_403_0@ if(document.isNull())

@H_403_0@ {

@H_403_0@ qDebug("documentisnull");

@H_403_0@ return;

@H_403_0@ }

@H_403_0@

@H_403_0@ //

@H_403_0@ QDomElementroot=document.documentElement();

@H_403_0@ QStringrootTagName=root.tagName();

@H_403_0@ qDebug()<<rootTagName;

@H_403_0@

@H_403_0@// //方式一

@H_403_0@// QDomElementcode=root.firstChildElement();

@H_403_0@// QStringcodeTagName=code.tagName();

@H_403_0@// qDebug()<<codeTagName;

@H_403_0@

@H_403_0@ //方式二

@H_403_0@// QDomNodeListnodeList=root.childNodes();

@H_403_0@// intnodeNum=nodeList.count();

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

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

@H_403_0@// {

@H_403_0@// QDomNodedomNode=nodeList.item(i);

@H_403_0@// QDomElementelement=domNode.toElement();

@H_403_0@

@H_403_0@// QDomNodeListchildList=element.childNodes();

@H_403_0@// intchildNum=childList.count();

@H_403_0@

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

@H_403_0@// {

@H_403_0@// QDomNodeddomNode=childList.item(j);

@H_403_0@// QDomElementeElement=ddomNode.toElement();

@H_403_0@

@H_403_0@// QDomNodeListcChildList=eElement.childNodes();

@H_403_0@// intcChildNum=cChildList.count();

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

@H_403_0@// {

@H_403_0@// QDomNodechildDomNode=cChildList.item(m);

@H_403_0@// QDomElementchildElement=childDomNode.toElement();

@H_403_0@// QStringchildTagName=childElement.tagName();

@H_403_0@// qDebug()<<childTagName;

@H_403_0@// QStringchildTagValue=childElement.text();

@H_403_0@// qDebug()<<childTagValue;

@H_403_0@// }

@H_403_0@// }

@H_403_0@// }

@H_403_0@

@H_403_0@ //方式三

@H_403_0@ QDomElementelement=root.firstChildElement();

@H_403_0@ while(!element.isNull())

@H_403_0@ {

@H_403_0@ QStringtagName=element.tagName();

@H_403_0@ QStringtagValue=element.text();

@H_403_0@ qDebug()<<tagName<<tagValue;

@H_403_0@ element=element.nextSiblingElement();

@H_403_0@ }

@H_403_0@}

@H_403_0@

@H_403_0@intmain()

@H_403_0@{

@H_403_0@ cout<<"HelloWorld!"<<endl;

@H_403_0@

@H_403_0@ //1.xmlstreamreaderparse

@H_403_0@ qDebug("xmlstreamreaderparse");

@H_403_0@// xmlDataStreamParse(xmlExample);

@H_403_0@ //2.xmldomdocumentparse

@H_403_0@ qDebug("xmldomdocumentparse");

@H_403_0@// xmlDataDomParse(xmlExample);

@H_403_0@ //3.xmlsaxparse

@H_403_0@ CSAXParsesaxParse;

@H_403_0@ saxParse.SetXMLData(xmlExample);

@H_403_0@

@H_403_0@ return0;

@H_403_0@}

原文链接:https://www.f2er.com/xml/294556.html

猜你在找的XML相关文章