一、描述

QXmlStreamWriter 用于编写 XML。它在一个由 setDevice() 指定的 QIODevice 上运行。API 简单明了:对于要编写的每个 XML 标记或事件,编写器都提供了一个专门的函数。

writeStartDocument() 开始一个文档,用 writeEndDocument() 结束它。这将隐式关闭所有剩余的打开标签。

以下代码片段显示了使用该类编写带缩进的格式化 XML 的基本用法:

    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setAutoFormatting(true);
    stream.writeStartDocument();
    stream.writeStartElement("bookmark");
    stream.writeAttribute("href", "http://www.baidu.com");
    stream.writeTextElement("title", "baidu");
    stream.writeEndElement();
    stream.writeEndDocument();
    file.close();

默认情况下,QXmlStreamWriter 以 UTF-8 编码 XML。可以使用 setCodec() 强制执行不同的编码。

二、属性成员

1、autoFormatting : bool:此属性控制流编写器是否自动格式化生成的 XML 数据。如果启用,编写器会自动向元素之间的空白部分(可忽略的空格)添加换行符和缩进。自动格式化的主要目的是将数据分行,并提高可读性。默认情况下,禁用自动格式化。

2、autoFormattingIndent : int:当启用自动格式化时,此属性保存用于缩进的空格或制表符的数量。正数表示空格,负数表示制表符。

三、成员函数

1、bool hasError()

如果写入失败,则返回 true。

如果流无法写入底层设备或要写入的数据包含无效字符,则会发生这种情况。

2、void setCodec(QTextCodec *codec)

      void setCodec(const char *codecName)

设置编解码器。编解码器用于对写入的任何数据进行编码。默认情况下,QXmlStreamWriter 使用 UTF-8。

注意:将 XML 写入 QString 时,将忽略编解码器信息,并且 XML 标头将不包含任何编码信息,因为所有 QString 都是 UTF-16。

3、void setDevice(QIODevice *device)

设置写入设备。

4、void writeAttribute(const QString &namespaceUri, const QString &name, const QString &value)

      void writeAttribute(const QString &qualifiedName, const QString &value)

      void writeAttribute(const QXmlStreamAttribute &attribute)

      void writeAttributes(const QXmlStreamAttributes &attributes)

写入属性,以指定的 namespaceUri 为前缀。 如果命名空间尚未声明,QXmlStreamWriter 将为其生成命名空间声明。

    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setAutoFormatting(true);
    stream.writeStartDocument();

    stream.writeStartElement("bookmark");
    stream.writeAttribute("href", "http://www.baidu.com");
    stream.writeAttribute("NS","href", "http://www.QQ.com");

    stream.writeEndDocument();
    file.close();

5、void writeCDATA(const QString &text)

将文本写入 CDATA 部分。 如果文本包含禁止字符序列“]]>”,则将其拆分为不同的 CDATA 部分。

这个函数主要是为了完整性而存在的。 通常不需要使用它,因为 writeCharacters() 会自动转义所有非内容字符。

    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setCodec("gb2312");//设置正确的编码才能显示中文
    stream.setAutoFormatting(true);
    stream.writeStartDocument();

    stream.writeStartElement("bookmark");
    stream.writeAttribute("href", "http://www.baidu.com");
    stream.writeCDATA("这是 CDATA");
    stream.writeEndDocument();
    file.close();

    stream.writeCDATA("这是 ]]> CDATA");

6、void writeCharacters(const QString &text)

写文本。 字符“<”、“&”、“”、“>” 被转义为实体引用“&lt;”、“&amp;”、“&quot;”、“&gt;”。

    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setCodec("gb2312");
    stream.setAutoFormatting(true);
    stream.writeStartDocument();

    stream.writeStartElement("bookmark");
    stream.writeAttribute("href", "http://www.baidu.com");
    stream.writeCharacters("这是 ]]> CDATA");
    stream.writeEndDocument();
    file.close();

7、void writeComment(const QString &text)

将文本写入 XML 注释,其中文本不得包含禁止序列“--”或以“-”结尾。 请注意,XML 不提供任何方式来转义注释中的“-”。

    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setCodec("gb2312");
    stream.setAutoFormatting(true);
    stream.writeStartDocument();

    stream.writeStartElement("bookmark");
    stream.writeAttribute("href", "http://www.baidu.com");
    stream.writeCharacters("baidu");
    stream.writeComment("我是注释");
    stream.writeEndDocument();
    file.close();

8、void writeCurrentToken(const QXmlStreamReader &reader)

写入读取器的当前状态。

9、void writeDTD(const QString &dtd)

写入 DTD 部分。

10、void writeDefaultNamespace(const QString &namespaceUri)

设置默认命名空间声明。

    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setCodec("gb2312");
    stream.writeDefaultNamespace("NS");
    stream.setAutoFormatting(true);
    stream.writeStartDocument();

    stream.writeStartElement("bookmark");
    stream.writeAttribute("href", "http://www.baidu.com");

    stream.writeEmptyElement("nextBookmark");
    stream.writeAttribute("href", "http://www.QQ.com");
    stream.writeEndElement();

    stream.writeEndElement();
    stream.writeEndDocument();
    file.close();

11、void writeEmptyElement(const QString &namespaceUri, const QString &name)

       void writeEmptyElement(const QString &qualifiedName)

写入一个带有名称的空元素,以指定的 namespaceUri 为前缀。如果尚未声明命名空间,QXmlStreamWriter 将为其生成命名空间声明。对 writeAttribute() 的后续调用将向该元素添加属性。

    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setCodec("gb2312");
    stream.writeDefaultNamespace("NS");
    stream.setAutoFormatting(true);
    stream.writeStartDocument();

    stream.writeStartElement("bookmark");
    stream.writeAttribute("href", "http://www.baidu.com");

    stream.writeEmptyElement("NS2","nextBookmark");
    stream.writeAttribute("href", "http://www.QQ.com");
    stream.writeAttribute("href2", "http://www.sohu.com");
    stream.writeEndElement();

    stream.writeEndElement();
    stream.writeEndDocument();
    file.close();

12、void writeEndDocument()

关闭所有剩余的打开开始元素并写入换行符。

13、void writeEndElement()

 关闭上一个开始元素。

14、void writeEntityReference(const QString &name)

将实体引用名称写入流,作为“&name;”。

15、void writeNamespace(const QString &namespaceUri, const QString &prefix = QString())

为带有前缀的 namespaceUri 编写命名空间声明。如果 prefix 为空,QXmlStreamWriter 分配一个唯一的前缀,由字母 'n' 后跟一个数字组成。

如果调用了 writeStartElement() 或 writeEmptyElement(),则声明适用于当前元素; 否则它适用于下一个子元素。

    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setCodec("gb2312");
    stream.writeDefaultNamespace("NS");
    stream.setAutoFormatting(true);
    stream.writeStartDocument();

    stream.writeStartElement("bookmark");
    stream.writeNamespace("NS","vv");
    stream.writeAttribute("href", "http://www.baidu.com");

    stream.writeEmptyElement("NS2","nextBookmark");
    stream.writeAttribute("href", "http://www.QQ.com");
    stream.writeAttribute("href2", "http://www.sohu.com");
    stream.writeTextElement("text","textData");
    stream.writeEndElement();

    stream.writeEndElement();
    stream.writeEndDocument();
    file.close();

16、void writeProcessingInstruction(const QString &target, const QString &data = QString())

编写带有目标和数据的 XML 处理指令,其中数据不能包含序列“?>”。

    stream.writeProcessingInstruction("xml-stylesheet", "type=\"text/css\"  href=\"style.css\"");

17、void writeStartDocument(const QString &version)

以 XML 版本号 version 开头写入文档。

    stream.writeStartDocument("V2.22");

18、void writeStartDocument()

写入以 XML 版本号“1.0”开头的文档。也会写入编码信息。

19、void writeStartDocument(const QString &version, bool standalone)

 编写以 XML 版本号 version 和独立属性 standalone 开头的文档。

    stream.writeStartDocument("V2.22",true);

20、void writeStartElement(const QString &namespaceUri, const QString &name)

        void writeStartElement(const QString &qualifiedName)

写入名称为name的元素,以 namespaceUri 为前缀。 如果命名空间尚未声明,QXmlStreamWriter 将为其生成命名空间声明。对 writeAttribute() 的后续调用将向该元素添加属性。

    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setCodec("gb2312");

    stream.writeDefaultNamespace("NS");
    stream.setAutoFormatting(true);

    stream.writeStartDocument();

    stream.writeStartElement("bookmark");
    stream.writeNamespace("NS","vv");
    stream.writeAttribute("href", "http://www.baidu.com");

    stream.writeStartElement("NS2","nextBookmark");
    stream.writeAttribute("href", "http://www.QQ.com");
    stream.writeTextElement("text","textData");
    stream.writeEndElement();

    stream.writeEndElement();
    stream.writeEndDocument();

    file.close();

 21、void writeTextElement(const QString &namespaceUri, const QString &name, const QString &text)

写入一个带有名称、前缀为指定 namespaceUri 和文本的文本元素。 如果尚未声明命名空间,QXmlStreamWriter 将为其生成命名空间声明。

此函数等同于:

    writeStartElement(namespaceUri, name);
    writeCharacters(text);
    writeEndElement();
    QFile file("demo.xml");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);

    QXmlStreamWriter stream(&file);
    stream.setCodec("gb2312");

    stream.writeDefaultNamespace("NS");
    stream.setAutoFormatting(true);

    stream.writeStartDocument();

    stream.writeStartElement("bookmark");
    stream.writeNamespace("NS","vv");
    stream.writeAttribute("href", "http://www.baidu.com");

    stream.writeStartElement("NS2","nextBookmark");
    stream.writeAttribute("href", "http://www.QQ.com");

    stream.writeTextElement("NS2","text1","textData1");

    stream.writeStartElement("NS2", "text2");
    stream.writeCharacters("textData2");
    stream.writeEndElement();

    stream.writeEndElement();
    stream.writeEndElement();
    stream.writeEndDocument();

    file.close();

22、void writeTextElement(const QString &qualifiedName, const QString &text)

写入一个文本元素。

此函数等同于:

     writeStartElement(qualifiedName);
     writeCharacters(text);
     writeEndElement();
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐