一.简介
如果要使用xml解析,需要在 pro 文件中 添加 xml模块
需要用到的类:
- QXmlStreamReader:提供了一个快速解析器,用于通过简单的流API读取XML。
- QXmlStreamAttributes:为XML属性。
QXmlStreamReader使用了递增式的解析器,适合于在整个XML文档中查找给定的标签、读入无法放入内存的大文件以及处理XML的自定义数据。
优点:快速、方便,分块读取XML文件,可读取大文件。
缺点:递增式解析器,只能顺序遍历XML文件的元素,不能随机访问。
二.示例
解析下面的xml文档
<?xml version="1.0" encoding="UTF-8"?>
<!--这是一行注释-->
<?xml-stylesheet type="text/css" href="style.css"?>
<People>
<WOMAN>
<AGE>16</AGE>
<WEIGHT>40</WEIGHT>
<INFO NAME="张三" HEIGHT="158"/>
</WOMAN>
<MAN>
<AGE>17</AGE>
<WEIGHT>45</WEIGHT>
<INFO NAME="李四" HEIGHT="161"/>
</MAN>
</People>
源码:
QFile file("test.xml");
if (!file.open(QIODevice::ReadOnly))
return;
QXmlStreamReader reader(&file);
// 解析XML直到结束
while (!reader.atEnd())
{
// 读取下一个元素
QXmlStreamReader::TokenType nType = reader.readNext();
switch (nType)
{
case QXmlStreamReader::StartDocument:
{
// XML版本+编码方式
QString strVersion = reader.documentVersion().toString();
QString strEncoding = reader.documentEncoding().toString();
qDebug()<< strVersion;
qDebug()<< strEncoding;
break;
}
case QXmlStreamReader::Comment:
{
// 注释
QString strComment = reader.text().toString();
qDebug() << strComment;
break;
}
case QXmlStreamReader::ProcessingInstruction:
{
// 处理指令
QString strProcInstr = reader.processingInstructionData().toString();
qDebug() << strProcInstr << "\r\n";
break;
}
case QXmlStreamReader::DTD:
{
//如果有DTD 如下解析
// DTD
// QString strDTD = reader.text().toString();
// // DTD 声明
// QString strDTDName = reader.dtdName().toString();
// QString strDTDPublicId = reader.dtdPublicId().toString(); // DTD 公开标识符
// QString strDTDSystemId = reader.dtdSystemId().toString(); // DTD 系统标识符
// qDebug() << QString("DTD : %1").arg(strDTD);
// qDebug() << QString("DTD 名称 : %1").arg(strDTDName);
// qDebug() << QString("DTD 公开标识符 : %1").arg(strDTDPublicId);
// qDebug() << QString("DTD 系统标识符 : %1").arg(strDTDSystemId);
// qDebug() << "\r\n";
break;
}
case QXmlStreamReader::StartElement:
{
// 开始元素
QString strElementName = reader.name().toString();
//找到根元素
if (QString::compare(strElementName, "People") == 0)
{
parse(reader);
}
break;
}
case QXmlStreamReader::EndDocument:
{
// 结束文档
qDebug()<<"parse finished";
break;
}
}
}
if (reader.hasError())
{
//解析出错
qDebug() << QString("错误信息:%1 行号:%2 列号:%3 字符位移:%4").arg(reader.errorString()).arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.characterOffset());
}
file.close(); // 关闭文件
//parse方法
void MainWindow::parse(QXmlStreamReader &reader)
{
while (!reader.atEnd())
{
reader.readNext();
if (reader.isStartElement())
{
// 开始元素
QString strElementName = reader.name().toString();
if (QString::compare(strElementName, "WOMAN") == 0 || QString::compare(strElementName, "MAN") == 0)
{
qDebug() << "WOMAN or MAN";
}
else if (QString::compare(strElementName, ("AGE")) == 0)
{
qDebug()<<"AGE = "<<reader.readElementText().toInt();
}
else if (QString::compare(strElementName,("WEIGHT")) == 0)
{
qDebug()<<"WEIGHT = "<<reader.readElementText().toInt();
}
else if (QString::compare(strElementName, ("INFO")) == 0)
{
QXmlStreamAttributes attrs = reader.attributes();
qDebug()<<"NAME = "<<attrs.value("NAME").toString();
qDebug()<<"HEIGHT = "<<attrs.value("HEIGHT").toInt();
}
}
else if (reader.isEndElement())
{
// 结束元素
QString strElementName = reader.name().toString();
if (QString::compare(strElementName, "WOMAN") == 0 || QString::compare(strElementName, "MAN") == 0)
{
qDebug() << "WOMAN or MAN finished";
}
else if (QString::compare(strElementName, "People") == 0)
{
qDebug() << "people finished";
break;
}
}
}
}
版权声明:本文为wzz953200463原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。