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

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、实现效果如下

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值