Qt模块化笔记之core——QXmlStreamWriter写XML

本节介绍使用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>

额外测试部显示不全,正确的如下:



  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值