72 XML流读取XML

时间:2019-02-11
本文章向大家介绍72 XML流读取XML,主要包括72 XML流读取XML使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

为什么用流读写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();