XML介绍

XML 用于存储数据,数据的形式类似于树结构(参考: http://www.runoob.com/xml/)

示例如下

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

其中第一行是XML声明,定义XML版本(1.0)以及所使用的编码格式

接下来的<note>,便是该文档的根元素

剩下的<to>,<from>,<heading>,<body>便是<note>的子元素

QXmlStreamReader

 常用函数:

QStringRef documentEncoding();    //获取XML编码,如果XML声明中未指定,则返回NULL

QStringRef documentVersion () ;   //获取XML版本,如果XML声明中未指定,则返回NULL

bool  atEnd ();
//如果读者一直读到XML文档的末尾,或者出现了错误,并且阅读被中止,那么返回true。否则,它将返回false。
//读取XML内容,如果读到XML末尾,或者读取出错时,将返回true,否则返回false
//当返回true时,可以通过error()判断是否读取出错 Error error () ; //返回错误类型,如果未出错,将返回QXmlStreamReader::NoError(数值0) void raiseError ( constQString & message = QString() );
//主动上报错误,并填入message 错误信息(可以通过errorString()获取),可以使得下次调用atEnd()时,直接返回true值 QString errorString();
//获取发生的错误信息 void QXmlStreamReader::setDevice ( QIODevice *device );
//设置QXmlStreamReader的解析设备,等价于QXmlStreamReader ( QIODevice *)构造函数 TokenType readNext(); //读取一次记号,并返回该数据的标志位,也可以通过 //常用标记如下所示:
QXmlStreamReader::StartDocument //文档开始位置,用来定义XML版本,编码等信息,
QXmlStreamReader::StartElement //元素开始位置
QXmlStreamReader::EndElement //元素结束位置

//比如<firstname>Anna</firstname>
//<firstname> </firstname>元素便是元素开始以及结束位置.
//“Anna”信息可以通过readElementText()成员函数获取. QXmlStreamAttributes attributes(); //获取元素的属性
//比如<entry term="of pictures">
//通过attributes().value("term").toString()则可以得到元素值"of pictures"

XML解析示例

以解析G:/QT/in.xml为例,该文件内容如下所示:

<?xml version="1.0"?>
<bookindex>
<entry term="sidebearings">
<page>10</page>
<page>34-35</page>
<page>307-308</page>
</entry> <entry term="subtraction">
<entry term="of pictures">
<page>115</page>
<page>244</page>
</entry> <entry term="of vectors">
<page>9</page>
</entry> </entry>
</bookindex>

代码如下所示:

#include <QtGui>

void ParseEntry(QXmlStreamReader* reader,QTreeWidgetItem* widget)       //递归函数,用来解析entry元素
{
QTreeWidgetItem *item =new QTreeWidgetItem(widget); //在widget下创建节点
item->setText(,reader->attributes().value("term").toString());
//获取entry元素的"term"值,并添加到第1列,比如"sidebearings"
QString pages; while(!reader->atEnd())
{
QXmlStreamReader::TokenType type=reader->readNext();
if(type==QXmlStreamReader::EndElement && reader->name()=="entry") //如果遇到 </entry>,则表示解析完成
{
break;
} if(type==QXmlStreamReader::StartElement)
{
if(reader->name()=="entry")
ParseEntry(reader,item); //如果是entry子元素,则继续递归执行 else if(reader->name()=="page")
pages=pages+reader->readElementText()+" "; //如果是page,则获取文本信息 else
reader->raiseError("Element Name Error "); //是其它元素,则上报Error信息
}
}
item->setText(,pages); //添加页数到第二列
} void readFile(QFile* File)
{
QXmlStreamReader* reader = new QXmlStreamReader(File);
QTreeWidget* widget = new QTreeWidget(); QStringList header;
header<<"term"<<"page";
widget->setHeaderLabels(header); while(!reader->atEnd())
{
QXmlStreamReader::TokenType type=reader->readNext();
if(type==QXmlStreamReader::StartElement && reader->name()=="entry")
ParseEntry(reader,widget->invisibleRootItem()); //开始解析"entry"元素里的内容
} File->close();
widget->show(); if(reader->hasError()) //如果解析出错
{
QMessageBox::information(NULL,"Read","Read :"+reader->errorString());
}
} int main(int argc, char *argv[])
{
QApplication a(argc,argv); QFile* File = new QFile("G:/QT/in.xml");
if(!File->open(QFile::ReadOnly | QFile::Text))
{
QMessageBox::information(NULL,"Open","Open error!");
return ;
} readFile(File); //解析File a.exec();
}

效果:

QXmlStreamWriter

常用函数

void    setAutoFormatting(bool enable)            //设置自动格式化文本,XML文本输出时,转化成容易读的形式,否则,就是一整行
void setAutoFormattingIndent(int spacesOrTabs)//格式化时缩进值,默认4个空格位
void setCodec(const char * codecName );  
            //设置编码格式,必须放在writeStartDocument()函数前面才起作用
void writeStartDocument();
void writeEndDocument(); void writeStartElement(constQString & qualifiedName );
void writeEndElement() void writeAttribute( constQString & qualifiedName, const QString & value );
//写入元素的属性值 void writeTextElement( constQString & qualifiedName, const QString & text );
//写入文本元素,比如<page>10</page>等于writeTextElement("page","10");

示例

#include <QtGui>
#include "widget.h" void WriteEntry(QXmlStreamWriter *writer,QString value,QStringList pages)
{
writer->writeStartElement("entry");
writer->writeAttribute("term",value); foreach(QString page,pages)
writer->writeTextElement("page",page); writer->writeEndElement();
} int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFile file("./out.xml");
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::information(NULL,"Error","Write Error");
return ;
} QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true); writer.writeStartDocument(); WriteEntry(&writer,"sidebearings",QStringList()<<""<<"34-35"<<"307-308"); writer.writeStartElement("entry");
writer.writeAttribute("term","subtraction"); WriteEntry(&writer,"of pictures",QStringList()<<""<<"34-35"<<"");
WriteEntry(&writer,"of vectors",QStringList()<<""); writer.writeEndElement();
writer.writeEndDocument(); file.close(); return ;
}

实现

<?xml version="1.0" encoding="UTF-8"?>

<entry term="sidebearings">
<page>10</page>
<page>34-35</page>
<page>307-308</page>
</entry>
<entry term="subtraction">
<entry term="of pictures">
<page>115</page>
<page>34-35</page>
<page>244</page>
</entry>
<entry term="of vectors">
<page>9</page>
</entry>
</entry>

22.QT-QXmlStreamReader解析,QXmlStreamWriter写入的更多相关文章

  1. xml解析、写入遇到的坑

    前言 最近在看一个线上xml文件导出的问题,需求如下: 从我们平台导出一个后缀为tmx的术语语料数据(实际内容为xml文件),然后导入到其他第三方平台发现无法导入. 从其他平台导入的tmx文件无法导入 ...

  2. Qt QJson解析json数据

    Qt QJson解析json数据 //加载根目录文件 void TeslaManageData::loadRootFolderFiles() { QNetworkAccessManager *mana ...

  3. Qt 文件搜索(写入文本文件)

    代码无意间在网上找到,下载回来后改了几个格式,编译后经测试可以正常使用,这个个文件搜索的很好的例子,有两种搜索方式:一种是按文件名作为关键字进行搜索,一种是以文档中所包含的关键字进行搜索,贴两张图先: ...

  4. Qt:解析命令行

    Qt从5.2版開始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行參数. 一.命令行写法 命令行:"-abc" 在QComm ...

  5. Qt linux文件同步写入

    因为linux 系统机制问题,文件的创建和写入并不会直接写入硬盘.而是先写入缓存,当系统要关闭或须要时才写入硬盘.为防止突然掉电,应将缓存中的文件及时同步到硬盘上去. linux 下的sync 命令具 ...

  6. Qt:解析命令行(使用QCommandLineOption和QCommandLineParser)

    Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数. 一.命令行写法命令行:"-abc" 在QComma ...

  7. Json---使用Jsoncpp解析与写入

    上述Json解析使用的是Jsoncpp,要使用Jsoncpp,得做如下几步的配置: 1.首先从http://sourceforge.net/projects/jsoncpp/下载,压缩包大约105k. ...

  8. Qt 无法解析外部文件2001,2019之类的

    一般是部分代码出错,比如构造函数的实参没有对应或者设置好: 还有尝试删除debug生成的文件试试,清理当前项目->重新构建: 以及看下有没有变量没有初始化或者变量定义的时候父类错了等. 以及其他 ...

  9. 使用jQuery解析JSON数据(由ajax发送请求到php文件处理数据返回json数据,然后解析json写入html中呈现)

    在上一篇的Struts2之ajax初析中,我们得到了comments对象的JSON数据,在本篇中,我们将使用jQuery进行数据解析. 我们先以解析上例中的comments对象的JSON数据为例,然后 ...

随机推荐

  1. vue数据双向绑定

    Vue的双向绑定是通过数据劫持结合发布-订阅者模式实现的,即通过Object.defineProperty监听各个属性的setter,然后通知订阅者属性发生变化,触发相应的回调. 整个过程分为以下几步 ...

  2. jQuery-弹幕

    该方法可能有bug,毕竟简单粗暴 <!DOCTYPE html><html> <head> <meta charset="UTF-8"&g ...

  3. javascript中数组总结

    数组是所有高级语言都会有的东西,数组是JS中使用最多的类型之一,所以掌握JS中数组的用法相当有帮助: 由于JS是一门弱类型的语言,所以数组里面可以放各种不同的数据类型,比如 var a = [1993 ...

  4. Codeforces Round #418 (Div. 2)

    A: 不细心WA了好多次 题意:给你一个a序列,再给你个b序列,你需要用b序列中的数字去替换a序列中的0,如果能够替换,则需要判断a是否能构成一个非递增的序列,a,b中所有的数字不会重复 思路:就是一 ...

  5. Django搭建博客记(一)

    这里记录一些 Django 搭建博客遇到的一些问题 参考书籍为 Django by Example, 这里记录与书籍内容不包含的内容. 搭建环境: 阿里云 ECS + CentOS7 一开始搭建的时候 ...

  6. 网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?

    1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步 ...

  7. Javascript高级编程学习笔记(34)—— 客户端检测(3)用户代理检测

    用户代理检测 前面的文章介绍的是如何检测浏览器对某一功能的支持情况 但是在实践中我们有些时候免不了需要知道用户到底是用的什么浏览器对我们的站点进行访问 这也是统计用户行为的一部分 用户代理检测这种方式 ...

  8. clion打断点不生效

    打开CLion的偏好设置(Preferences),选择Build,Execution,Deployment->Toolchains,将Debugger中的Bundled LLDB修改为Bund ...

  9. Apache Commons FileUpload 实现文件上传

    Commons FileUpload简介 Apache Commons是一个专注于可重用Java组件开发的 Apache 项目.Apache Commons项目由三个部分组成: 1.Commons P ...

  10. Python遍历List集合四种方法

    这篇文章主要介绍了Python 列表(List) 的四种遍历方法实例 详解的相关资料,需要的朋友可以参考下 分别是:直接遍历对象 通过索引遍历 通过enumerate方法 通过iter方法. 使用Py ...