XML文件读写
2017-06-01 13:56
423 查看
xmlstream.h
xmlstream.cpp
main.cpp
#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(); }