为什么用流读写XML?
从Qt 4.3开始引入了两个新的类来读取和写入XML文档: QXmlStreamReader和QXmlStreamWriter。
QXmlStreamReader类提供了一个快速的解析器通过一个简单的流API来读取格式良好的XML文档,它是作为Qt的SAX解析器的替代品的身份出现的,因为它比SAX解析器更快更方便。流读取器的基本原理就是将XML文档报告为一个记号(tokens)流,应用程序代码自身来驱动循环,在需要的时候可以从读取器中一个接一个的拉出记号。这个是通过调用readNext()函数实现的,它可以读取下一个记号,然后返回一个记号类型,它由QXmlStreamReader::TokenType定义,其所有取值如表所列。然后可以使用isStartElement()和text()等函数来判断这个记号是否包含需要的信息。
与QXmlStreamReader对应的是QXmlStreamWriter,它通过一个简单的流API提供了一个XML写入器。QXmlStreamWriter的使用也是十分简单的,只需要调用相应的记号的写入函数来写入相关数据即可。
XML流包含两个部分QXmlStreamReader和和QXmlStreamWriter。 QXmlStream Reader 类提供了一个快速的解析器.它通过一个简单的流API 来读取格式良好的XML 文挡,它是作为Qt 的SAX 解析器的替代品身份出现的,因为它比SAX 解析器更快更方便。
在SAX 中,应用程序必须提供处理器(回调函数)来从解析器获得所谓的XML 事件;而QXmlStreamReader是应用程序代码向身来驱动循环,在需要的时候可以从读取器中一个接一个地拉出记号。
流读取XML
流读取是通过调用readNext ()函数实现的. 它可以读取下一个记号,然后返回一个记号类型;它由枚举变量QXmlStreamReader : : Token Type 定义。然后可以使用isStartElement()和text()等函数来判断这个记号是否包含需要的信息。使用这种主动拉取记号的方式最大的好处就是可以构建递归解析器,也就是可以在不同的函数或者类中来处理XML 文档中的不同记号。
QFile file("../myxmlstream/my.xml");
if (!file.open(QFile::ReadOnly | QFile::Text)) {
qDebug()<<"Error: cannot open file"; return 1; }
QXmlStreamReader reader;
reader.setDevice(&file); // 设置文件,这时会将流设置为初始状态
while (!reader.atEnd()) { // 如果没有读到文档结尾,而且没有出现错误
// 读取下一个记号,它返回记号的类型
QXmlStreamReader::TokenType type = reader.readNext();
// 下面便根据记号的类型来进行不同的输出
if (type == QXmlStreamReader::StartDocument)
qDebug() << reader.documentEncoding() << reader.documentVersion();
if (type == QXmlStreamReader::StartElement) {
qDebug() << "<" << reader.name() << ">";
if (reader.attributes().hasAttribute("id"))
qDebug() << reader.attributes().value("id"); }
if (type == QXmlStreamReader::EndElement)
qDebug() << "</" << reader.name() << ">";
if (type == QXmlStreamReader::Characters && !reader.isWhitespace())
qDebug() << reader.text(); }
// 如果读取过程中出现错误,那么输出错误信息
if (reader.hasError()) { qDebug() << "error: " << reader.errorString();}
file.close();
流写入XML
与QXmlStreamReader对应的是QXmlStreamWriter,它通过一个简单的流API提供了一个XML 写人器。QXmlStreamWriter的使用也十分简单,只需要调用相应记号的写入函数来写入相关数据即可。
QFile file("../myxmlstream/my2.xml");
if (!file.open(QFile::WriteOnly | QFile::Text))
{
qDebug() << "Error: cannot open file";
return 1;
}
QXmlStreamWriter stream(&file);
stream.setAutoFormatting(true);
stream.writeStartDocument();
stream.writeStartElement("bookmark");
stream.writeAttribute("href", "http://www.qt.io/");
stream.writeTextElement("title", "Qt Home");
stream.writeEndElement();
stream.writeEndDocument();
file.close();