0

0

Qt解析XML的示例代码分享

黄舟

黄舟

发布时间:2017-04-13 10:30:24

|

3761人浏览过

|

来源于php中文网

原创

如何使用qxmlstreamreader来解析格式良好的xml,qt的文档中指出,它是一种更快、更方便的qt自己的sax解析器(qxmlsimplereader)的替代,它也较快,在某种情况下,比dom(qdomdocument)更方便。

    XML文件:

1462.jpg

广研企业网站管理系统中英文双语版
广研企业网站管理系统中英文双语版

v1.8新增功能简介: 一、后台新增生成网站地图和生成Sitemap.xml的功能。 二、新增下载中心功能,可在后台上传doc,xls,ppt,rar,pdf文件。 三、新增产品缩略图自动缩放功能,图片按比例缩放,解决了图片变形问题。 四、新闻、产品详细页新增了上一个、下一个的功能,改善用户体验。 五、在线客服新增了阿里巴巴贸易通在线客服。 六、可在后台设置分享代码,如百度分享和AddThis等。

下载

解析方法:

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());
}

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

57

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

57

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

237

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

393

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

17

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

103

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

73

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

81

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
XML教程
XML教程

共142课时 | 5.8万人学习

XQuery 教程
XQuery 教程

共12课时 | 3.7万人学习

XLink  教程
XLink 教程

共7课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号