Qt编程之Xml文件的读取 | 您所在的位置:网站首页 › kml怎么读 › Qt编程之Xml文件的读取 |
目录 一、xml的格式说明 二、QT中读取xml的类与常用函数 三、代码思路 四、代码实现 五、结果展示 XML最主要的功能是数据传输,有的时候可以当一个小型的数据库来使用,因为其定义标签高度自由,所以在一些软件需要经常修改的配置变量常常采用xml格式的文件来保存,在需要用到该变量时在事先写好的xml类型文件中进行修改。 本篇博客给出的代码从如何完整读出一个xml文件的思路出发。 逻辑难度不大,但需要读者耐心琢磨。方能写出一个属于自己的读取xml的通用函数。 如果读者对xml格式已经如数家珍,请跳过xml的格式说明,直接进入思路分析 一、xml的格式说明1.xml的头声明在语法上可有可无,但标准化的书写规范要求一定要有头声明 需要注意的是头声明的前后一定要有问号(?) ,否则在读取xml文件时会无法读取这条语句而造成读取失败。 2.xml有一个根节点,此处我们定义为root,需要强调的是任意节点都可以自定义,其标签定义是高度自由的。 章鱼 中国 18根节点下的user和age称作子节点,user相对于homeland来说又是homeland的根节点。所以xml是一个树状结构,什么时候是根什么时候为子都是相对而言,但需要牢记xml文件只有唯一的一个根节点挂着所有的子节点。 ![]() QT中提供了一个读取xml的类QXmlStreamReader,该类在使用时就是创建一个读取xml文件的迭代器变量。 QXmlStreamReader xmlReader(&filename); //xmlReader就是一个迭代器常用的一些API函数如下: 1.通过readNextStartElement()挨个读入节点 2.通过isStartElement()和isEndElement()判断是节点的开始和结束 3.通过name()得到当前节点的名字 4.通过readElementText()访问当前节点的内容 5.通过attributes()获取还有属性节点的属性 6.通过atEnd()判断XML文件是否结束 7.通过hasError()判断XML文件是否出错 三、代码思路在了解xml的格式后,从人的角度出发,我们通常是看根节点,然后看根节点下的节点,读完一整个根节点的内容之后再去看下一个根节点。这样描述有些混乱,读者可以根据上述图1来进行理解。从根节点出发,然后读左一节点,读完左一节点后读中间节点,读完中间节点后读右一节点。 那么转换到机器中(代码)我们需要怎么去做呢?既然是树状结构,且要一段一段的去读,应该只要设置一个迭代器,先找到根节点,然后去寻找根节点下的内容,节点中的内容进行再判定,符合条件执行代码,不符合条件跳过;读完一个节点的内容转到下一个节点去,就是读完左一节点,再到中间节点,直到将根节点遍历结束,也就是将xml文件遍历到文件结尾处。 为此我想到要用if和while循环的结合,在找到某一个节点的条件下,用else if再判定节点中的条件,直到该条件结束之前,都要对该节点下的内容进行响应操作。 代码模式: if(xmlReader.name() == "根节点名字" && xmlReader.isStartElement()) { xmlReader.readNextStartElement(); while(!(xmlReader.name() == "根节点名字" && xmlReader.isEndElement()) { xmlReader.readNextStartElement(); if(xmlReader.name() == "节点名字1" && xmlreader.isStartElement()) { while(!(xmlReader.name() == "节点名字1" && xmlReader.isEndElement()) { ...... } } else if(xmlReader.name() == "节点名字2" && xmlreader.isStartElement()) { while(!(xmlReader.name() == "节点名字2" && xmlReader.isEndElement()) { ...... } } } } 四、代码实现1.准备一个xml文档,名字为testconfig.xml,文档内容如下: kingglore.xml zy 123456 孙悟空 孙悟空@qq.com 孙悟空.hello.cn 7891011 貂蝉 貂蝉@qq.com 貂蝉.hello.cn 1112131415 小乔 小乔@qq.com 小乔.hello.cn 1617181920 屠夫 屠夫@qq.com 屠夫.hello.cn2.创建一个Qt工程,添加一个config类,用来实现xml文件的读取 config.h #ifndef CONFIG_H #define CONFIG_H #include #include #include #include class Config { public: Config(); public: QString readConfig(); //读取xml文件的函数 }; #endif // CONFIG_Hconfig.cpp 函数实现中的file.setFileName(qApp->applicationDirPath()+"/Config/testconfig.xml"); Qt开发的程序猿都应该知道,在编译运行后会出现一个新生成的文件夹build-QT_XML-Desktop_Qt_5_12_4_MinGW_32_bit-Debug,小编将程序的保存路径设为D:/QT_code/ 其中qApp是头文件QApplication中的指针,指代了该应用程序,在file.setFileName(qApp->applicationDirPath()+"/Config/testconfig.xml");处打断点进入调试 qApp->applicationDirPath()该语句的作用是找到应用程序的路径,获取的是D:/QT_code/build-QT_XML-Desktop_Qt_5_12_4_MinGW_32_bit-Debug 所以还需要在编译后手动在上述路径中手动添加Config文件夹,将testconfig.xml文件放在该文件夹下(也可以自己编写代码实现生成文件夹,读者不妨自己一试) ![]() |
CopyRight 2018-2019 实验室设备网 版权所有 |