XML文件读写

来源:互联网 发布:windows系统字体大小 编辑:程序博客网 时间:2024/06/03 16:49

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();}
原创粉丝点击