QT XML数据解析

该文介绍了如何使用QT库中的QXmlStreamReader和QXmlStreamWriter类来解析和创建XML文件。通过QFileDialog选择文件,然后利用QXmlStreamReader读取XML文档的元素、属性和内容,显示在界面上。同时,文章展示了如何用QXmlStreamWriter生成新的XML文件,包括添加元素、属性和注释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pro文件

QT  +=  xml

需要的头文件

#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QFile>
#include <QFileDialog>

解析XML数据

void MainWindow::fromXml()
{
    QString filename = QFileDialog::getOpenFileName(this, " 打开XML数据", "./", "Xml文件 (*.xml)");
    if(filename.isEmpty())
        return;

    QFile file(filename);
    //只读方式打开文件
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QXmlStreamReader reader(&file);
        //reader.atEnd():是否读到结尾
        //reader.hasError():是否有错误
        while(!reader.atEnd() && !reader.hasError())
        {
            QXmlStreamReader::TokenType token =  reader.readNext();//读取一个节点
            if(token == QXmlStreamReader::StartDocument)//开始文档标签
            {
                //没啥效果
                QString documentNode = reader.text().toString();
                ui->content_txt->append(documentNode);
            }

            if(reader.isStartElement())//开始节点标签(元素)
            {
                //标签名称
                QString elementNode = reader.name().toString();
                ui->content_txt->append(elementNode);

                //标签属性
                QXmlStreamAttributes attributes = reader.attributes();
                //是否有指定属性
//                if(attributes.hasAttribute("Data"))
//                {
//                    qDebug()<<"is Data Element";
//                }
                //遍历当前标签的所有属性
                foreach(QXmlStreamAttribute attr , attributes)
                {
                    qDebug()<<" ("<<attr.name()<<"="<<attr.value()<<") ";
                    ui->content_txt->append(" ("+attr.name()+"="+attr.value()+") ");
                }
                //标签内容 reader.text()
                qDebug()<<" ("<<reader.text().toString()<<") ";
                ui->content_txt->append(" ("+reader.text().toString()+") ");

            }
        }

        if(reader.hasError())//有错误
        {
            qDebug()<<"reader error"<<reader.errorString();
        }
        reader.clear();
        file.close();

    }
}

转为XML数据

<?xml version="1.0" encoding="UTF-8"?>
<Project>
    <Data Address="302">
        <Message Content="Data.Message">
            <!--hello world-->
            <Details>hello world!</Details>
        </Message>
    </Data>
    <Data Address="302">
        <Message Content="DataMessage">
            <!--hello world-->
        </Message>
    </Data>
</Project>
void MainWindow::toXml()
{
    QString filename = QFileDialog::getSaveFileName(this, "保存XML数据", "test.xml", "Xml文件 (*.xml)");
    if(filename.isEmpty())
        return;

    QFile file(filename);
    if(file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))//QIODevice::Truncate覆盖文本
    {
        QXmlStreamWriter writer(&file);
        writer.setAutoFormatting(true);//格式化
        writer.writeStartDocument();

        writer.writeStartElement("Project");//<Project>

        writer.writeStartElement("Data");       //<Data Address="302">
        writer.writeAttribute("Address", "302");

        writer.writeStartElement("Message");         //<Message Content="DataMessage">
        writer.writeAttribute("Content", "Data.Message");

        //<!--hello world-->
        writer.writeComment("hello world");

        //文本节点,自动添加结尾标签
        writer.writeTextElement("Details","hello world!"); //<Details>hello world!</Details>

        writer.writeEndElement();//</Message>
        writer.writeEndElement();//</Data>

        writer.writeStartElement("Data");
        writer.writeAttribute("Address", "302");
        writer.writeStartElement("Message");
        writer.writeAttribute("Content", "DataMessage");
        writer.writeComment("hello world");
        writer.writeEndElement();
        writer.writeEndElement();

        writer.writeEndElement();//<Project>
        writer.writeEndDocument();
        file.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值