QtXml:QXmlStreamWriter
一、描述QXmlStreamWriter 用于编写 XML。它在一个由 setDevice() 指定的 QIODevice 上运行。API 简单明了:对于要编写的每个 XML 标记或事件,编写器都提供了一个专门的函数。用 writeStartDocument() 开始一个文档,用 writeEndDocument() 结束它。这将隐式关闭所有剩余的打开标签。以下代码片段显示了使用该类编写带缩进的格
一、描述
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)
写文本。 字符“<”、“&”、“””、“>” 被转义为实体引用“<”、“&”、“"”、“>”。
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();
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)