福建省漳州市建设局网站,广州通报: 广州通报,工作计划表模板,湖南网站建设oqiandu如何使用QXmlStreamReader来解析格式良好的XML#xff0c;Qt的文档中指出#xff0c;它是一种更快、更方便的Qt自己的SAX解析器#xff08;QXmlSimpleReader#xff09;的替代#xff0c;它也较快#xff0c;在某种情况下#xff0c;比DOM#xff08;QDomDocument…如何使用QXmlStreamReader来解析格式良好的XMLQt的文档中指出它是一种更快、更方便的Qt自己的SAX解析器QXmlSimpleReader的替代它也较快在某种情况下比DOMQDomDocument更方便。 解析方法
void ParseXML::parseXML(QString file_name)
{if(file_name.isEmpty()) return; QFile *file new QFile(file_name); if(!file-open(QFile::ReadOnly | QFile::Text)) { QMessageBox::information(NULL, QString(title), QString(open error!));return; } //QXmlStreamReader操作任何QIODevice.QXmlStreamReader xml(file);QList persons;//解析XML直到结束while(!xml.atEnd() !xml.hasError()){//读取下一个element.QXmlStreamReader::TokenType token xml.readNext();//如果获取的仅为StartDocument,则进行下一个if(token QXmlStreamReader::StartDocument) {continue;}//如果获取了StartElement,则尝试读取if(token QXmlStreamReader::StartElement){//如果为persons直接进入下一个if(xml.name() persons){continue;}//如果为person则对其进行解析if(xml.name() person){persons.append(this-parsePerson(xml));}}}if(xml.hasError()){QMessageBox::information(NULL, QString(parseXML), xml.errorString());}//从reader中删除所有设备、数据并将其重置为初始状态xml.clear();
}QMap ParseXML::parsePerson(QXmlStreamReader xml)
{QMap person;//检查是否获取personif(xml.tokenType() ! QXmlStreamReader::StartElement xml.name() person){return person;}//获取person属性QXmlStreamAttributes attributes xml.attributes();if(attributes.hasAttribute(id)) {person[id] attributes.value(id).toString();}//操作下一个xml.readNext();while(!(xml.tokenType() QXmlStreamReader::EndElement xml.name() person)) {if(xml.tokenType() QXmlStreamReader::StartElement){if(xml.name() name){this-addElementDataToMap(xml, person);}if(xml.name() age) {this-addElementDataToMap(xml, person);}if(xml.name() email) {this-addElementDataToMap(xml, person);}if(xml.name() website) {this-addElementDataToMap(xml, person);}}xml.readNext();}QString id person[id];QString name person[name];QString age person[age];QString email person[email];QString website person[website];return person;
}void ParseXML::addElementDataToMap(QXmlStreamReader xml, QMap map) const
{if(xml.tokenType() ! QXmlStreamReader::StartElement) {return;}QString elementName xml.name().toString();xml.readNext();if(xml.tokenType() ! QXmlStreamReader::Characters) {return;}map.insert(elementName, xml.text().toString());
}