加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

QT解析XML文件

发布时间:2020-12-16 08:25:00 所属栏目:百科 来源:网络整理
导读:QT解析XML文件 一.QT提供三种处理XML文件方式 DOM(DocumentObject Model) :将整个 XML 文档读入内存,构建成一个树结构,允许程序在树结构上向前向后移动导航,这是与另外两种方式最大的区别,也就是允许实现多次解析器(对应于QXmlStreamReader 的一次

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&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;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读