qt xml解析与处理
一、QXMLStreamWriter
QXmlStreamWriter是Qt框架中提供的一个用于写入XML文档的类。它提供了一个简单的流API,允许开发者方便地生成符合XML规范的文档。
基本功能
- 创建、修改和保存XML文件:使用QXmlStreamWriter,可以创建新的XML文件,修改现有的XML文件内容,并将结果保存到文件中。
- 支持XML元素:包括节点、属性、命名空间等常见的XML元素。
- 编码支持:默认情况下,QXmlStreamWriter以UTF-8编码XML,但可以通过setCodec()方法设置不同的编码。
常用函数:
使用方法
- 包含头文件:在使用QXmlStreamWriter之前,需要包含其头文件
#include <QXmlStreamWriter>
。 - 设置写入设备:QXmlStreamWriter通过QIODevice来写入数据,因此需要先创建一个QIODevice对象(如QFile),并设置其为QXmlStreamWriter的写入设备。
- 写入XML内容:通过QXmlStreamWriter提供的各种方法,如writeStartDocument()、writeStartElement()、writeAttribute()、writeCharacters()、writeEndElement()和writeEndDocument()等,来构建XML文档的结构和内容。
- 关闭文件:完成写入后,应关闭QFile对象以释放资源。
二、QXmlStreamReader
QXmlStreamReader是Qt框架中的一个类,专门用于解析XML文档。它提供了一种基于流的、高效的读取XML数据的方式,特别适合处理大型XML文件或需要实时解析XML数据的场景。
常用函数
- readNext():读取下一个标记,并返回其类型。
- name():获取当前标记的名称(如果是元素标记)。
- attributes():获取当前元素的属性集合(如果是StartElement)。
- text():获取当前字符标记的文本内容(如果是Characters标记)。
- isStartElement()、isEndElement()等:判断当前标记的类型。
- atEnd():判断是否已经读取到文档的末尾。
- hasError():判断在解析过程中是否有错误发生。
- errorString():获取发生的错误信息的字符串表示。
使用方法
- 创建对象:首先,需要创建一个QXmlStreamReader对象,并将其与要解析的XML文档关联起来。这可以通过将QFile对象(或其他QIODevice派生类的对象)传递给QXmlStreamReader的构造函数或调用setDevice()方法来实现。
- 读取标记:使用readNext()方法读取XML文档中的下一个标记。该方法会返回一个枚举值,表示读取到的标记类型(如StartElement、EndElement、Characters等)。
- 处理标记:根据readNext()返回的标记类型,使用相应的方法来获取和处理标记的信息。例如,如果读取到的是一个StartElement,可以使用name()获取元素名称,使用attributes()获取元素属性等。
- 循环读取:通常,会将readNext()方法放在一个循环中,直到读取到文档的末尾(atEnd()返回true)。
- 错误处理:在循环结束后,应检查是否有错误发生(hasError()返回true),如果有,则使用errorString()等方法获取错误信息并进行处理。
三、DEMO
output.xml
<?xml version="1.0" encoding="UTF-8"?>
<student><id id="1"><name>王维</name><age>15</age><height>165</height><weight>50</weight></id>
</student>
void createXML(const QString &fileName)
{QFile file(fileName);if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){return ;}QXmlStreamWriter Writer;Writer.setDevice(&file);//获取流Writer.setAutoFormatting(true);Writer.writeStartDocument();//添加XML说明(版本号和编码信息Writer.writeStartElement("student");//写入起始元素Writer.writeStartElement("id");Writer.writeAttribute("id","1");//写入属性Writer.writeTextElement("name","王维");Writer.writeTextElement("age","15");Writer.writeTextElement("height","165");Writer.writeTextElement("weight","50");Writer.writeEndElement();//结束id元素编辑Writer.writeEndElement();//结束student元素编辑Writer.writeEndDocument();//结束整个的编辑file.close();//关闭文件
}void parseXML(const QString &fileName) {QFile file(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {qWarning("Failed to open file.");return;}QXmlStreamReader reader(&file);while (!reader.atEnd() && !reader.hasError()){QXmlStreamReader::TokenType type = reader.readNext();if (type == QXmlStreamReader::StartDocument){qDebug()<<reader.documentVersion()<<" "<<reader.documentEncoding();//读取版本号和编码类型continue;}else if (type == QXmlStreamReader::StartElement){qDebug() << "name:" << reader.name();//获取元素名if(reader.attributes().hasAttribute("id"))//如果有属性{qDebug() << "id:" << reader.attributes().value("id");//输出属性}}else if(type==QXmlStreamReader::EndElement)//获取结束元素{qDebug() << "end:" <<reader.name();}else if(type==QXmlStreamReader::Characters&&!reader.isWhitespace()){qDebug() << "text:" << reader.text();//读取内容}}if (reader.hasError()) {qWarning() << "XML Error:" << reader.errorString();}file.close();
}int main(int argc, char *argv[])
{QApplication a(argc, argv);createXML("output.xml");parseXML("output.xml");return a.exec();
}
qq群交流:698593923
觉得有帮助的话,打赏一下呗。。