本节介绍使用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 & 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("张三",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("姓名",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>
额外测试部显示不全,正确的如下: