Qt解析XML的示例代码分享
16lz
2021-01-22
如何使用QXmlStreamReader来解析格式良好的XML,Qt的文档中指出,它是一种更快、更方便的Qt自己的SAX解析器(QXmlSimpleReader)的替代,它也较快,在某种情况下,比DOM(QDomDocument)更方便。
XML文件:
解析方法:
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; //检查是否获取person if(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());}
更多相关文章
- android三种操作XML的方法总结
- jscript和vbscript对XML元素属性进行操作的方法
- 分享一个jscript与vbscript操作XML元素属性的方法
- c#中xml操作类的代码详解
- c#对xml的CURD操作的代码示例
- 总结关于文件记录操作实例教程
- 内容和属性用法的相关文章推荐
- Linux学习:文件IO(不带缓冲区),原子操作概念
- Apollo 源码解析 —— Config Service 操作审计日志 Audit