本节介绍使用QXmlStreamWriter将XML写入文件。
其公有函数如下:
QXmlStreamWriter()
QXmlStreamWriter(QIODevice * device)
QXmlStreamWriter(QByteArray * array)
QXmlStreamWriter(QString * string)
~QXmlStreamWriter()
bool autoFormatting() const
int autoFormattingIndent() const
QTextCodec * codec() const
QIODevice * device() const
bool hasError() const
void setAutoFormatting(bool enable)//设置自动格式化文本,XML文本输出时,转化成容易读的形式,否则,就是一整行
void setAutoFormattingIndent(int spacesOrTabs)//格式化时缩进值,默认4个空格位
void setCodec(QTextCodec * codec)
void setCodec(const char * codecName)
void setDevice(QIODevice * device)
void writeComment(const QString & text)//写注释
//—————头部————
void writeStartDocument(const QString & version)
void writeStartDocument(const QString & version, bool standalone)
void writeStartDocument()
//—————脖子————
void writeProcessingInstruction(const QString & target, const QString & data = QString())//处理指令
void writeDTD(const QString & dtd)
//—————身体————
void writeStartElement(const QString & namespaceUri, const QString & name)
void writeStartElement(const QString & qualifiedName)
void writeTextElement(const QString & namespaceUri, const QString & name, const QString & text)
void writeTextElement(const QString & qualifiedName, const QString & text)//qualifiedName即为标签名,text即为开始与结束
标签间文本,写带文本的标签
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)
void writeEntityReference(const QString & name)//即写"&name;"到流中
void writeCDATA(const QString & text)//CDATA 指的是不应由 XML 解析器进行解析的文本数据,CDATA 部分由 "<![CDATA[" 开始,
由 "]]>" 结束
void writeCharacters(const QString & text)//自动将实体引用字符转化输出。如:writeCharacters(“>”),写入文本中的
为">"
void writeEmptyElement(const QString & namespaceUri, const QString & name)
void writeEmptyElement(const QString & qualifiedName)
//—————收尾————
void writeEndElement()
void writeEndDocument()
void writeNamespace(const QString & namespaceUri, const QString & prefix = QString())
void writeDefaultNamespace(const QString & namespaceUri)
void writeCurrentToken(const QXmlStreamReader & reader)
————————————————————————————————————————————————
再次提及下处理指令,以便能使用writeProcessingInstruction,这有个比较好理解的版本:
处理指令(PI)的语法和XML声明类似,以<?开始,以?>结束。一个常见的使用样式表单的处理指令如下所示:
<?xml-stylesheet href="hello.css" type="text/css"?>
"xml-stylesheet"叫做处理指令的目标,它必须标识到用到的应用程序,要注意的是对于其他的非W3C定义的处理指令不能以字符串"XML"和xml"开头;其余的部分是传递给应用程序的字符数据。应用程序从处理指令中取得目标和数据,执行要求的动作。
————————————————————————————————————————————————
一个基本写XML例子:
代码:
注:m_map在头文件中,有QMap<QString,QList<QString> > m_map;
#include "dialog.h"
#include "ui_dialog.h"
#include <QFile>
#include <QList>
#include <QXmlStreamWriter>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
QList<QString> lst1;
lst1.append("男");
lst1.append("22岁");
QList<QString> lst2;
lst2.append("男");
lst2.append("26岁");
m_map.insert("张三",lst1);
m_map.insert("李四",lst2);
QFile file("Names.xml");
if(file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true);
writer.writeStartDocument();
writer.writeStartElement("NAMES");
QMap<QString,QList<QString> >::iterator it;
for ( it = m_map.begin(); it != m_map.end(); it++ )
{
QList<QString> lst=it.value();
writer.writeStartElement("name");
writer.writeTextElement("姓名",it.key());
writer.writeTextElement("性别",lst[0]);
writer.writeTextElement("年龄",lst[1]);
writer.writeEndElement();
}
writer.writeEndElement();
writer.writeEndDocument();
file.close();
}
}
Dialog::~Dialog()
{
delete ui;
}
文件输出:
<?xml version="1.0" encoding="UTF-8"?>
<NAMES>
<name>
<姓名>张三</姓名>
<性别>男</性别>
<年龄>22岁</年龄>
</name>
<name>
<姓名>李四</姓名>
<性别>男</性别>
<年龄>26岁</年龄>
</name>
</NAMES>
————————————————————————————————————————————————
尝试使用一些其它功能:
#include "dialog.h"
#include "ui_dialog.h"
#include <QFile>
#include <QList>
#include <QXmlStreamWriter>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//基本使用
QList<QString> lst1;
lst1.append("男");
lst1.append("22岁");
QList<QString> lst2;
lst2.append("男");
lst2.append("26岁");
m_map.insert("张三",lst1);
m_map.insert("李四",lst2);
// QFile file("Names.xml");
// if(file.open(QIODevice::WriteOnly | QIODevice::Text))
// {
// QXmlStreamWriter writer(&file);
// writer.setAutoFormatting(true);
// writer.writeStartDocument();
// writer.writeStartElement("NAMES");
// QMap<QString,QList<QString> >::iterator it;
// for ( it = m_map.begin(); it != m_map.end(); it++ )
// {
// QList<QString> lst=it.value();
// writer.writeStartElement("name");
// writer.writeTextElement("姓名",it.key());
// writer.writeTextElement("性别",lst[0]);
// writer.writeTextElement("年龄",lst[1]);
// writer.writeEndElement();
// }
// writer.writeEndElement();
// writer.writeEndDocument();
// file.close();
// }
//尝试其它函数
QFile file2("Names2.xml");
if(file2.open(QIODevice::WriteOnly | QIODevice::Text))
{
QXmlStreamWriter writer(&file2);
writer.setAutoFormatting(true);
writer.writeComment("这是一份革命烈士名单");
writer.writeStartDocument("1.0",true);
writer.writeProcessingInstruction("xml-stylesheet","href=\"hello.css\" type=\"text/css\"");
writer.writeDTD("<!DOCTYPE NAMES [<!ELEMENT NAMES (name)><!ELEMENT name (姓名,性别,年龄)><!ELEMENT 姓名 (#PCDATA)><!ELEMENT 性别 (#PCDATA)><!ELEMENT 年龄 (#PCDATA)>]>");
writer.writeStartElement("NAMES");
QMap<QString,QList<QString> >::iterator it;
int i=0;
for ( it = m_map.begin(); it != m_map.end(); it++ )
{
QList<QString> lst=it.value();
writer.writeStartElement("name");
writer.writeAttribute("id",QString::number(i, 10));
writer.writeTextElement("姓名",it.key());
writer.writeTextElement("性别",lst[0]);
writer.writeTextElement("年龄",lst[1]);
writer.writeEndElement();
i++;
}
writer.writeStartElement("额外测试");
writer.writeEntityReference("dd");
writer.writeCDATA("<script type=\"text/javascript\"><script>");
writer.writeCharacters(">");
writer.writeEmptyElement("writeEmptyElement");
writer.writeEndElement();
writer.writeEndElement();
writer.writeEndDocument();
file2.close();
}
}
Dialog::~Dialog()
{
delete ui;
}
结果如下:
<!--这是一份革命烈士名单--><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="hello.css" type="text/css"?>
<!DOCTYPE NAMES [<!ELEMENT NAMES (name)><!ELEMENT name (姓名,性别,年龄)><!ELEMENT 姓名 (#PCDATA)><!ELEMENT 性别 (#PCDATA)><!ELEMENT 年龄 (#PCDATA)>]>
<NAMES>
<name id="0">
<姓名>张三</姓名>
<性别>男</性别>
<年龄>22岁</年龄>
</name>
<name id="1">
<姓名>李四</姓名>
<性别>男</性别>
<年龄>26岁</年龄>
</name>
<额外测试>ⅆ<![CDATA[<script type="text/javascript"><script>]]>><writeEmptyElement/>
</额外测试>
</NAMES>
额外测试部显示不全,正确的如下: