XML文件读写

xmlstream.h

#include <QXmlStreamWriter>
#include <QXmlStreamReader>

class XmlStream
{
public:
    XmlStream();

    void writeXml();
    void readXml();
    void parseBlog(QXmlStreamReader &reader);
};

xmlstream.cpp

#include "xmlstream.h"

#include <QFile>
#include <QDebug>


XmlStream::XmlStream()
{

}

void XmlStream::writeXml()
{
    QString strFile("Blogs.xml");
    QFile file(strFile);
    if (!file.open(QFile::WriteOnly | QFile::Text)) { // 只写模式打开文件
        qDebug() << QString("Cannot write file %1(%2).").arg(strFile).arg(file.errorString());
        return;
    }

    QXmlStreamWriter writer(&file);
    // writer.setCodec("GBK");  // XML 编码
    writer.setAutoFormatting(true); // 自动格式化
    writer.writeStartDocument("1.0", true);  // 开始文档(XML 声明)
    writer.writeComment(QString::fromLocal8Bit("纯正开源之美,有趣、好玩、靠谱。。。"));  // 注释
    writer.writeProcessingInstruction("xml-stylesheet type=\"text/css\" href=\"style.css\"");  // 处理指令

    // DTD
    writer.writeDTD(QString::fromLocal8Bit("<!DOCTYPE Blogs [ <!ENTITY Copyright \"Copyright 2016《Qt实战一二三》\"> <!ELEMENT Blogs (Blog)> <!ELEMENT Blog (作者,主页,个人说明)> <!ELEMENT 作者     (#PCDATA)> <!ELEMENT 主页     (#PCDATA)> <!ELEMENT 个人说明  (#PCDATA)> ]>"));

    writer.writeStartElement("Blogs");  // 开始根元素 <Blogs>
    writer.writeAttribute("Version", "1.0");  // 属性

    writer.writeStartElement("Blog");  // 开始子元素 <Blog>
    writer.writeTextElement(QString::fromLocal8Bit("作者"), QString::fromLocal8Bit("一去丶二三里"));
    writer.writeTextElement(QString::fromLocal8Bit("主页"), "http://blog.csdn.net/liang19890820");
    writer.writeTextElement(QString::fromLocal8Bit("个人说明"), QString::fromLocal8Bit("青春不老,奋斗不止!"));
    writer.writeEntityReference("Copyright");
    writer.writeCDATA(QString::fromLocal8Bit("<Qt分享&&交流>368241647</Qt分享&&交流>"));
    writer.writeCharacters(">");
    writer.writeEmptyElement(QString::fromLocal8Bit("Empty"));  // 空元素
    writer.writeEndElement();  // 结束子元素 </Blog>

    writer.writeEndElement();  // 结束根元素 </Blogs>
    writer.writeEndDocument();  // 结束文档

    file.close();  // 关闭文件


    //    注意:使用 writeStartElement() 打开元素标签后,要有相应的 writeEndElement() 来关闭。

}

void XmlStream::readXml()
{
    QFile file("Blogs.xml");
    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {  // 以只写模式打开文件
        QXmlStreamReader reader(&file);

        // 解析 XML,直到结束
        while (!reader.atEnd()) {

            // 读取下一个元素
            QXmlStreamReader::TokenType nType = reader.readNext();

            switch (nType) {
            case QXmlStreamReader::StartDocument: {  // 开始文档
                qDebug() << QString::fromLocal8Bit("********** 开始文档(XML 声明) ********** ");
                // XML 声明
                QString strVersion = reader.documentVersion().toString();
                QString strEncoding = reader.documentEncoding().toString();
                bool bAlone = reader.isStandaloneDocument();
                qDebug() << QString::fromLocal8Bit("版本:%1  编码:%2  Standalone:%3")
                            .arg(strVersion).arg(strEncoding).arg(bAlone) << "\r\n";
                break;
            }
            case QXmlStreamReader::Comment: {  // 注释
                qDebug() << QString::fromLocal8Bit("********** 注释 ********** ");
                QString strComment = reader.text().toString();
                qDebug() << strComment << "\r\n";
                break;
            }
            case QXmlStreamReader::ProcessingInstruction: {  // 处理指令
                qDebug() << QString::fromLocal8Bit("********** 处理指令 ********** ");
                QString strProcInstr = reader.processingInstructionData().toString();
                qDebug() << strProcInstr << "\r\n";
                break;
            }
            case QXmlStreamReader::DTD: {   // DTD
                qDebug() << QString::fromLocal8Bit("********** DTD ********** ");
                QString strDTD = reader.text().toString();
                QXmlStreamNotationDeclarations notationDeclarations = reader.notationDeclarations();  // 符号声明
                QXmlStreamEntityDeclarations entityDeclarations = reader.entityDeclarations();  // 实体声明
                // DTD 声明
                QString strDTDName = reader.dtdName().toString();
                QString strDTDPublicId = reader.dtdPublicId().toString();  // DTD 公开标识符
                QString strDTDSystemId = reader.dtdSystemId().toString();  // DTD 系统标识符
                qDebug() << QString::fromLocal8Bit("DTD : %1").arg(strDTD);
                qDebug() << QString::fromLocal8Bit("DTD 名称 : %1").arg(strDTDName);
                qDebug() << QString::fromLocal8Bit("DTD 公开标识符 : %1").arg(strDTDPublicId);
                qDebug() << QString::fromLocal8Bit("DTD 系统标识符 : %1").arg(strDTDSystemId);
                qDebug() << "\r\n";

                break;
            }
            case QXmlStreamReader::StartElement: {  // 开始元素
                QString strElementName = reader.name().toString();
                if (QString::compare(strElementName, "Blogs") == 0) {  // 根元素
                    qDebug() << QString::fromLocal8Bit("********** 开始元素<Blogs> ********** ");
                    QXmlStreamAttributes attributes = reader.attributes();
                    if (attributes.hasAttribute("Version")) {
                        QString strVersion = attributes.value("Version").toString();
                        qDebug() << QString::fromLocal8Bit("属性:Version(%1)").arg(strVersion);
                    }

                    parseBlog(reader);
                }
                break;
            }
            case QXmlStreamReader::EndDocument: {  // 结束文档
                qDebug() << QString::fromLocal8Bit("********** 结束文档 ********** ");
                break;
            }
            }
        }

        if (reader.hasError()) {  // 解析出错
            qDebug() << QString::fromLocal8Bit("错误信息:%1  行号:%2  列号:%3  字符位移:%4").arg(reader.errorString()).arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.characterOffset());
        }

        file.close();  // 关闭文件
    }
}

void XmlStream::parseBlog(QXmlStreamReader &reader)
{
    while (!reader.atEnd()) {
        reader.readNext();
        if (reader.isStartElement()) {  // 开始元素
            QString strElementName = reader.name().toString();
            if (QString::compare(strElementName, "Blog") == 0) {
                qDebug() << QString::fromLocal8Bit("********** 开始元素<Blog> ********** ");
            } else if (QString::compare(strElementName, QStringLiteral("作者")) == 0) {  // 方式一
                reader.readNext();
                if (reader.isCharacters()) {
                    qDebug() << QStringLiteral("作者:%1").arg(reader.text().toString());
                }
            } else if (QString::compare(strElementName, QStringLiteral("主页")) == 0) {  // 方式二
                qDebug() << QStringLiteral("主页:%1").arg(reader.readElementText());
            } else if (QString::compare(strElementName, QStringLiteral("个人说明")) == 0) {
                qDebug() << QStringLiteral("个人说明:%1").arg(reader.readElementText());
            }
        } else if (reader.isEntityReference()) {  // 实体引用
            QString strName = reader.name().toString();
            QString strText = reader.text().toString();
            qDebug() << QString("EntityReference : %1(%2)").arg(strName).arg(strText);
        } else if (reader.isCDATA()) {  // CDATA
            QString strCDATA = reader.text().toString();
            qDebug() << QString("CDATA : %1").arg(strCDATA);

            reader.readNext();
            if (reader.isCharacters()) {
                QString strCharacters = reader.text().toString();
                qDebug() << QString("Characters : %1").arg(strCharacters);
            }
        } else if (reader.isEndElement()) {  // 结束元素
            QString strElementName = reader.name().toString();
            if (QString::compare(strElementName, "Blogs") == 0) {
                qDebug() << QString::fromLocal8Bit("********** 结束元素<Blogs> ********** ");
                break;  // 跳出循环(解析 QXmlStreamReader::EndDocument)
            } else if (QString::compare(strElementName, "Blog") == 0) {
                qDebug() << QString::fromLocal8Bit("********** 结束元素<Blog> ********** ");
            }
        }
    }
}

main.cpp

#include <QCoreApplication>

#include "xmlstream.h"

#include <QFile>
#include <QDebug>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    XmlStream x;
    x.writeXML();
    x.readXml();

    return a.exec();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值