QT解析XML文件
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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |