前端之家收集整理的这篇文章主要介绍了
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