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();
}