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

Qt编程5:使用QXmlStreamReader解析xml(简单应用)

发布时间:2020-12-15 22:41:10 所属栏目:百科 来源:网络整理
导读:1、准备xml文件包含内容如下: ?xml version="1.0" encoding="UTF-8"?MsgData id="1"titlexmlnamehello.xml/xmlnameownerzhj/owner/titleNumber123456/NumberNamezhangjie/Nameemailzhangjie@sina.cn/emailwebsitezhangjie.hello.cn/website/DataData id="2"

1、准备xml文件包含内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Msg>
	<Data id="1">
		<title>
			<xmlname>hello.xml</xmlname>
			<owner>zhj</owner>
		</title>
		<Number>123456</Number>
		<Name>zhangjie</Name>
		<email>zhangjie@sina.cn</email>
		<website>zhangjie.hello.cn</website>
	</Data>
	<Data id="2">
		<Number>789012</Number>
		<Name>haier</Name>
		<email>haier@sina.cn</email>
		<website>haier.sina.cn</website>
	</Data>
	<Data id="3">
		<Number>345678</Number>
		<Name>sum</Name>
		<email>sum@sina.cn</email>
		<website>sum.sina.cn</website>
	</Data>
	<Data id="4">
		<Number>901234</Number>
		<Name>niil</Name>
		<email>niil@sina.cn</email>
		<website>niil.sina.cn</website>
	</Data>
</Msg>

2、QXmlStreamReader接口说明

创建一个QXmlStreamReader的类对象
通过setDevice()设置好要处理的XML文件
通过readNext()挨个读入节点,
通过isStartElement()和isEndElement()判断是节点的开始和结束.

通过name()得到当前节点名字
通过readElementText()访问当前节点的内容

通过attributes()获取含有属性的节点的属性

3、实现代码如下:

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include “QXmlStreamReader”

#include "QDebug"

#include "QFile"





MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),ui(new Ui::MainWindow)

{

    ui->setupUi(this);



    //将xml文件读取数据

    QFile file("hello.xml");

    if(file.open(QIODevice::ReadOnly | QIODevice::Text))

    {

        //构建QXmlStreamReader对象

        QXmlStreamReader reader(&file);



        while(!reader.atEnd())

        {

            //判断是否是节点的开始

            if(reader.isStartElement())

            {

                //将属性读出:例如 id="3" age = "23">

                QXmlStreamAttributes attributes = reader.attributes();

                //判断是否存在属性"id"

                if(attributes.hasAttribute("id"))

                {

                    //将属性id追加textBrower

                    ui->textBrowser->append(QString("id:%1").arg(attributes.value("id").toString()));

                }



                //判断当前节点的名字是否为Number

                if(reader.name() == "Number")

                    ui->textBrowser->append(QString("Number:%1").arg(reader.readElementText()));

                //判断当前节点的名字是否为Name

                else if(reader.name() == "Name")

                    ui->textBrowser->append(QString("Name:%1").arg(reader.readElementText()));

                //判断当前节点的名字是否为email

                else if(reader.name() == "email")

                    ui->textBrowser->append(QString("email:%1").arg(reader.readElementText()));

                //判断当前节点的名字是否为website

                else if(reader.name() == "website")

                    ui->textBrowser->append(QString("website:%1").arg(reader.readElementText()));

            }

            //节点结束、并且节点名字为Data(含有子节点)

            else if(reader.isEndElement() && reader.name() == "Data")

            {

                ui->textBrowser->append("--------------------");

                ui->textBrowser->append("");

            }

            reader.readNext();

        }

        file.close();

    }

    else

    {

        qDebug()<<"Open file hello.xml failure";

    }



}



MainWindow::~MainWindow()

{

    delete ui;

}


4、实现效果如下

(编辑:李大同)

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

    推荐文章
      热点阅读