【Qt笔记】保存 XML

前面几章咱们讨论了读取 XML 文档的三种方法。虽然各有千秋,可是 Qt 推荐的是使用QXmlStreamReader。与此同时,许多应用程序不只须要读取 XML,还须要写入 XML。为此,Qt 一样提供了三种方法:ide

  1. 使用QXmlStreamWriter
  2. 构造一个 DOM 树,而后掉其save()函数;
  3. 使用QString手动生成 XML。

 

能够看出,不管咱们使用哪一种读取方式,这几种写入的方法都与此无关。这是由于 W3C 仅仅定义了如何处理 XML 文档,并无给出如何生成 XML 文档的标准方法(尽管当咱们使用 DOM 方式读取的时候,依旧可使用一样的 DOM 树写入)。函数

如同 Qt 所推荐的,咱们也推荐使用QXmlStreamWriter生成 XML 文档。这个类帮助咱们作了不少工做,好比特殊字符的转义。接下来咱们使用QXmlStreamWriter将前面几章使用的 XML 文档生成出来:code

QFile file("bookindex.xml");
if (!file.open(QFile::WriteOnly | QFile::Text)) {
    qDebug() << "Error: Cannot write file: "
             << qPrintable(file.errorString());
    return false;
}

QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true);
xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("bookindex");
xmlWriter.writeStartElement("entry");
xmlWriter.writeAttribute("term", "sidebearings");
xmlWriter.writeTextElement("page", "10");
xmlWriter.writeTextElement("page", "34-35");
xmlWriter.writeTextElement("page", "307-308");
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("entry");
xmlWriter.writeAttribute("term", "subtraction");
xmlWriter.writeStartElement("entry");
xmlWriter.writeAttribute("term", "of pictures");
xmlWriter.writeTextElement("page", "115");
xmlWriter.writeTextElement("page", "224");
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("entry");
xmlWriter.writeAttribute("term", "of vectors");
xmlWriter.writeTextElement("page", "9");
xmlWriter.writeEndElement();
xmlWriter.writeEndElement();
xmlWriter.writeEndDocument();
file.close();
if (file.error()) {
    qDebug() << "Error: Cannot write file: "
             << qPrintable(file.errorString());
    return false;
}
// ...

首先,咱们以只写方式建立一个文件。而后基于该文件咱们建立了QXmlStreamWriter对象。setAutoFormatting()函数告诉QXmlStreamWriter要有格式输出,也就是会有标签的缩进。咱们也可使用QXmlStreamWriter::setAutoFormattingIndent()设置每一个缩进所须要的空格数。接下来是一系列以 write 开始的函数。这些函数就是真正输出时须要用到的。注意这些函数以 write 开始,有 Start 和 End 两个对应的名字。正如其名字暗示那样,一个用于写入开始标签,一个用于写入结束标签。writeStartDocument()开始进行 XML 文档的输出。这个函数会写下orm

<?xml version="1.0" encoding="UTF-8"?>

一行。与writeStartDocument()相对应的是最后的writeEndDocument(),告诉QXmlStreamWriter,这个 XML 文档已经写完。下面咱们拿出一段典型的代码:xml

xmlWriter.writeStartElement("entry");
xmlWriter.writeAttribute("term", "of vectors");
xmlWriter.writeTextElement("page", "9");
xmlWriter.writeEndElement();

显然,这里咱们首先写下一个 entry 的开始标签,而后给这个标签一个属性 term,属性值是 of vectors。writeTextElement()函数则会输出一个仅包含文本内容的标签。最后写入这个标签的关闭标签。这段代码的输出结果就是:对象

<entry term="of vectors">
    <page>9</page>
</entry>

其他部分与此相似,这里再也不赘述。这样,咱们就输出了一个与前面章节所使用的相同的 XML 文档:文档

<?xml version="1.0" encoding="UTF-8"?>
<bookindex>
    <entry term="sidebearings">
        <page>10</page>
        <page>34-35</page>
        <page>307-308</page>
    </entry>
    <entry term="subtraction">
        <entry term="of pictures">
            <page>115
            <page>224
        </entry>
        <entry term="of vectors">
            <page>9</page>
        </entry>
    </entry>
</bookindex>

尽管咱们推荐使用QXmlStreamWriter生成 XML 文档,可是若是如今已经有了 DOM 树,显然直接调用QDomDocument::save()函数更为方便。在某些状况下,咱们须要手动生成 XML 文档,好比经过QTextStream字符串

//!!! Qt4
QTextStream out(&file);
out.setCodec("UTF-8");
out << "<doc>\n"
    << "   <quote>" << Qt::escape(quoteText) << "</quote>\n"
    << "   <translation>" << Qt::escape(translationText)
    << "</translation>\n"
    << "</doc>\n";

//!!! Qt5
QTextStream out(&file);
out.setCodec("UTF-8");
out << "<doc>\n"
    << "   <quote>" << quoteText.toHtmlEscaped() << "</quote>\n"
    << "   <translation>" << translationText.toHtmlEscaped()
    << "</translation>\n"
    << "</doc>\n";

这种办法是最原始的办法:咱们直接除了字符串,把字符串拼接成 XML 文档。须要注意的是,quoteText 和 translationText 都须要转义,这是 XML 规范里面要求的,须要将文本中的 <,> 以及 & 进行转义。不过,转义函数在 Qt4 中是Qt::escape(),而 Qt5 中则是QString::toHtmlEscaped(),须要按需使用。it

相关文章
相关标签/搜索