您的位置:首页 > 其它

XML文件读写

2017-06-01 13:56 423 查看
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: