Qt 读写XML文件

#ifndef SIM_XMLSTREAMREADER_H_
#define SIM_XMLSTREAMREADER_H_#include <QString>
#include <QXmlStreamReader>class XmlStreamReader
{
public:XmlStreamReader();~XmlStreamReader();//读取文件bool ReadFile(const QString &fileName);//跳过不能识别的元素void SkipUnknownElement();//读取XML文件的主体部分void ReadWantDecideEditElement();//解析想定基本信息void ReadScenarioElement();//解析想定文件实体信息void ReadEntitiesElement();//解析想定文件模型发布订阅关系void ReadModelsElement();//解析该实体的所有参数void ReadParametersElement();//解析发布关系void ReadPublishElement();//解析订阅关系void ReadSubscribeElement();private:QXmlStreamReader m_qxml_reader;
};#endif //SIM_XMLSTREAMREADER_H_
#include "xml_stream_reader.h"
#include <QFile>
#include <QDebug>
#include <iostream>
using namespace std;XmlStreamReader::XmlStreamReader()
{}XmlStreamReader::~XmlStreamReader()
{
}bool XmlStreamReader::ReadFile(const QString &fileName)
{QFile file(fileName);if (!file.open(QFile::ReadOnly | QFile::Text)) {std::cerr << "Error: Cannot read file " << qPrintable(fileName)<< ": " << qPrintable(file.errorString())<< std::endl;return false;}//如果文件打开成功,将它设置为QXmlStreamReader的输入设备m_qxml_reader.setDevice(&file);//readNext()函数从输入流中读取下一个记号,如果成功而且还没有到达XML文件的结尾,函数将进入while循环,//每次调用readNext()函数,下一个记号就会被读取并变成当前的记号,readNext()函数报告error,atEnd返回true
    m_qxml_reader.readNext(); //当读取到XML文档结尾,或者发生错误,atEnd()函数返回truewhile (!m_qxml_reader.atEnd()) {//如果当前记号为StartElement,返回trueif (m_qxml_reader.isStartElement()){if (m_qxml_reader.name() == "WantDecideEdit") {ReadWantDecideEditElement();}else {m_qxml_reader.raiseError(QObject::tr("Not a WantDecideEdit file"));}}else {m_qxml_reader.readNext();}}file.close();if (m_qxml_reader.hasError()){std::cerr << "Error: Failed to parse file "<< qPrintable(fileName) << ": "<< qPrintable(m_qxml_reader.errorString()) << std::endl;return false;}else if (file.error() != QFile::NoError) {std::cerr << "Error: Cannot read file " << qPrintable(fileName)<< ": " << qPrintable(file.errorString())<< std::endl;return false;}return true;
}void XmlStreamReader::ReadWantDecideEditElement()
{//跳过当前记号,只可能是WantDecideEdit记号
    m_qxml_reader.readNext();while (!m_qxml_reader.atEnd()) {//如果读取到关闭标签,只能是</WantDecideEdit>记号,跳过这个标签并跳出循环if (m_qxml_reader.isEndElement()){if (m_qxml_reader.name() == "WantDecideEdit"){m_qxml_reader.readNext();break;}elsem_qxml_reader.readNext();}if (m_qxml_reader.isStartElement()){if (m_qxml_reader.name() == "ScenarioInfo"){ReadScenarioElement();}else if (m_qxml_reader.name() == "Entities"){ReadEntitiesElement();}else if (m_qxml_reader.name() == "Models"){ReadModelsElement();}else{SkipUnknownElement();}}else{m_qxml_reader.readNext();}}
}void XmlStreamReader::ReadScenarioElement()
{m_qxml_reader.readNext();while (!m_qxml_reader.atEnd()) {if (m_qxml_reader.isEndElement()) {if (m_qxml_reader.name() == "ScenarioInfo"){m_qxml_reader.readNext();break;}elsem_qxml_reader.readNext();}if (m_qxml_reader.isStartElement()) {if (m_qxml_reader.name() == "Name"){QString name = m_qxml_reader.readElementText();qDebug() << "name:" << name << endl;}else if (m_qxml_reader.name() == "ModificationDate"){QString modification_date = m_qxml_reader.readElementText();qDebug() << "modification_date:" << modification_date << endl;}else if (m_qxml_reader.name() == "Description"){QString description = m_qxml_reader.readElementText();qDebug() << "description:" << description << endl;return;}else {SkipUnknownElement();}}else {m_qxml_reader.readNext();}}
}void XmlStreamReader::ReadParametersElement()
{m_qxml_reader.readNext();while (!m_qxml_reader.atEnd()){if (m_qxml_reader.isEndElement()){if (m_qxml_reader.name() == "Parameters"){m_qxml_reader.readNext();break;}elsem_qxml_reader.readNext();}if (m_qxml_reader.isStartElement()){if (m_qxml_reader.name() == "Parameter"){QString name = m_qxml_reader.attributes().value("name").toString();QString type = m_qxml_reader.attributes().value("type").toString();QString display_name = m_qxml_reader.attributes().value("displayName").toString();QString usage = m_qxml_reader.attributes().value("usage").toString();QString value = m_qxml_reader.attributes().value("value").toString();qDebug() << "name:" << name << " " << "type:" << type << " " << "display_name:" << display_name << " " << "usage:" << usage << " " << "value:" << value << endl;m_qxml_reader.readNext();}else{SkipUnknownElement();}}else{m_qxml_reader.readNext();}}
}void XmlStreamReader::ReadPublishElement()
{m_qxml_reader.readNext();while (!m_qxml_reader.atEnd()){if (m_qxml_reader.isEndElement()){if (m_qxml_reader.name() == "Publish"){m_qxml_reader.readNext();break;}elsem_qxml_reader.readNext();}if (m_qxml_reader.isStartElement()){if (m_qxml_reader.name() == "Topic"){QString topic_name = m_qxml_reader.attributes().value("topicName").toString();QString topic_param_name = m_qxml_reader.attributes().value("topicParamName").toString();QString model_param_name = m_qxml_reader.attributes().value("modelParamName").toString();qDebug() << "topicName:" << topic_name << ",topicParamName:" << topic_param_name << ",modelParamName:" << model_param_name << endl;m_qxml_reader.readNext();}else{SkipUnknownElement();}}else{m_qxml_reader.readNext();}}
}void XmlStreamReader::ReadSubscribeElement()
{m_qxml_reader.readNext();while (!m_qxml_reader.atEnd()){if (m_qxml_reader.isEndElement()){if (m_qxml_reader.name() == "Subscribe"){m_qxml_reader.readNext();break;}elsem_qxml_reader.readNext();}if (m_qxml_reader.isStartElement()){if (m_qxml_reader.name() == "Topic"){QString topic_name = m_qxml_reader.attributes().value("topicName").toString();QString topic_param_name = m_qxml_reader.attributes().value("topicParamName").toString();QString model_param_name = m_qxml_reader.attributes().value("modelParamName").toString();qDebug() << "topicName:" << topic_name << ",topicParamName:" << topic_param_name << ",modelParamName:" << model_param_name << endl;m_qxml_reader.readNext();}else{SkipUnknownElement();}}else{m_qxml_reader.readNext();}}
}void XmlStreamReader::ReadEntitiesElement()
{m_qxml_reader.readNext();while (!m_qxml_reader.atEnd()) {if (m_qxml_reader.isEndElement()) {if (m_qxml_reader.name() == "Entities"){m_qxml_reader.readNext();break;}elsem_qxml_reader.readNext();}if (m_qxml_reader.isStartElement()) {if (m_qxml_reader.name() == "Entity"){QString object_handle = m_qxml_reader.attributes().value("objectHandle").toString();qDebug() << "objectHandle:" << object_handle << endl;QString model_uuid = m_qxml_reader.attributes().value("modelUUID").toString();qDebug() << "modelUUID:" << model_uuid<<endl;m_qxml_reader.readNext();}else if (m_qxml_reader.name() == "Parameters"){ReadParametersElement();}else {SkipUnknownElement();}}else {m_qxml_reader.readNext();}}
}void XmlStreamReader::ReadModelsElement()
{m_qxml_reader.readNext();while (!m_qxml_reader.atEnd()) {if (m_qxml_reader.isEndElement()) {if (m_qxml_reader.name() == "Models"){m_qxml_reader.readNext();break;}elsem_qxml_reader.readNext();}if (m_qxml_reader.isStartElement()) {if (m_qxml_reader.name() == "Model"){QString model_uuid = m_qxml_reader.attributes().value("modelUUID").toString();qDebug() << "modelUUID:" << model_uuid<<endl;m_qxml_reader.readNext();}else if (m_qxml_reader.name() == "Publish"){ReadPublishElement();}else if (m_qxml_reader.name() == "Subscribe"){ReadSubscribeElement();}else {SkipUnknownElement();}}else {m_qxml_reader.readNext();}}
}
void XmlStreamReader::SkipUnknownElement()
{m_qxml_reader.readNext();while (!m_qxml_reader.atEnd()) {if (m_qxml_reader.isEndElement()) {m_qxml_reader.readNext();break;}if (m_qxml_reader.isStartElement()) {SkipUnknownElement();}else {m_qxml_reader.readNext();}}
}
void writeIndexEntry(QXmlStreamWriter *xmlWriter, QTreeWidgetItem *item)
{xmlWriter->writeStartElement("entry");xmlWriter->writeAttribute("term", item->text(0));QString pageString = item->text(1);if (!pageString.isEmpty()){QStringList pages = pageString.split(", ");foreach(QString page, pages)xmlWriter->writeTextElement("page", page);}for (int i = 0; i < item->childCount(); ++i)writeIndexEntry(xmlWriter, item->child(i));xmlWriter->writeEndElement();
}bool WriteXml(const QString &fileName, QTreeWidget *treeWidget)
{QFile file(fileName);if (!file.open(QFile::WriteOnly | QFile::Text)) {std::cerr << "Error: Cannot write file "<< qPrintable(fileName) << ": "<< qPrintable(file.errorString()) << std::endl;return false;}QXmlStreamWriter xmlWriter(&file);//开启自动格式编辑功能,XML文档将以更友好易读的格式输出,在每一行都有明确显示数据递归结构的缩进xmlWriter.setAutoFormatting(true);//在XML文档首行写"<?xml version="1.0" encoding="UTF-8"?>"
    xmlWriter.writeStartDocument();xmlWriter.writeStartElement("WantDecideEdit");for (int i = 0; i < treeWidget->topLevelItemCount(); ++i)writeIndexEntry(&xmlWriter, treeWidget->topLevelItem(i));xmlWriter.writeEndDocument();file.close();if (file.error()){std::cerr << "Error: Cannot write file "<< qPrintable(fileName) << ": "<< qPrintable(file.errorString()) << std::endl;return false;}return true;
}

 

转载于:https://www.cnblogs.com/LuckCoder/p/10942373.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三十一期:QQ for Linux 复活,微信 for Linux 还远吗?

网友通过分析龙芯处理器的生态支持计划与近期 QQ for Linux 支持 MIPS 架构的事实&#xff0c;结合当前国产自主研发的大背景&#xff0c;认为距离微信 for Linux 的发布也不远了。 10 月 24 日晚间&#xff0c;腾讯突然发布了沉寂多年的 QQ for Linux 新版本&#xff0c;引起了…

[Leetcode][第141、142题][JAVA][环形链表][哈希表][快慢指针][数学推理]

【问题描述】[中等] 【解答思路】 141 每次遍历到一个节点时&#xff0c;判断该节点此前是否被访问过。 具体地&#xff0c;我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点&#xff0c;如果该节点已经存在于哈希表中&#xff0c;则说明该链表是环形链…

847. Shortest Path Visiting All Nodes(三)

DP  这道题目还可以用动态规划解决。在图论中解决最短路径问题有Dijkstra算法和bellman-ford算法。这道题目也需要用到DP。所以先学习一下这两个算法的思想和区别。  两个算法比较  Dijstra算法用来解决单源最短路径问题。具体内容看[文章] 算法解决问题适用范围解决思路松…

样式集合

box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.3);转载于:https://www.cnblogs.com/xmyd/p/10943567.html

第三十二期:你们都是怎么学Python的?

自学Python一个月&#xff0c;怎么学都学不进去&#xff0c;感觉自己方法错了&#xff0c;现在连入门都不算&#xff0c;我该怎么办啊&#xff1f;这应该是每一个零基础学Python的小白都会面临的问题&#xff0c;今天我就结合自己的经历&#xff0c;和大家分享一下我是怎么学Py…

[Leetcode][第1002题][JAVA][查找常用字符][计数][HashMap]

【问题描述】[简单] 【解答思路】 计数法 1. minfreq存放最终重复字母的个数 freq存放每次遍历字符串的字母个数 2. minfreq初始化最大值&#xff0c;每遍历一个字符串后&#xff0c;比较minfreq[i]、freq[i]的大小&#xff0c;minfreq[i]更新为两者的最小值。 3. 根据minf…

815. Bus Routes

输入&#xff1a;int[][] routes routes[i]表示第i号公交车的运行线路。如果routes[i]{1,3,5}。说明公交车运行线路是1->3->5。    int S&#xff1a;表示起始站点    int T&#xff1a;表示目的站点 输出&#xff1a;从&#xff33;到&#xff34;最少需要几辆公交…

第三十三期:连接池中非常关键的两个参数,到底是干啥用的?

说来惭愧&#xff0c;从事互联网开发好些年了&#xff0c;有些概念一直没有彻底搞清楚。其中之一就是,ttp client配置连接池的时候,maxConnectionsPerHost,和maxTotalConnections,在网上搜了一圈&#xff0c;发现很多都讲的含含糊糊的。 作者&#xff1a;资深开发讲技术 背景 …

一个密码经过多次MD5加密能否提高安全性?Java MD5盐值加解密

什么是MD5? MD5&#xff08;Message Digest Algorithm 5&#xff0c;信息摘要算法5&#xff09;&#xff0c;是计算机广泛使用的摘要算法&#xff08;又称哈希算法&#xff09;之一。MD5是将一段信息&#xff0c;通过其不可逆的字符串变换算法&#xff0c;产生了唯一的MD5信息…

[Leetcode][第24题][JAVA][两两交还的链表中的节点][递归][三指针]

【问题描述】[中等] 【解答思路】 1. 递归 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {public ListNode swapPairs(ListNode head) {if(head null || head.next null){return head;}ListNode next head.next;head.next swapPairs(next.next…

301. Remove Invalid Parentheses

目录题目描述回溯法有效剪枝&#xff0c;速度更快回溯法改进题目描述 输入&#xff1a;一个字符串&#xff0c;包含(,)&#xff0c;还有一些其他字符。 输出&#xff1a;左右括号完全匹配的字符串。并且要尽可能少的删除字符。 规则&#xff1a;有左括号&#xff0c;有对应的右…

第三十四期:花了一个星期,我终于把RPC框架整明白了!

RPC(Remote Procedure Call)&#xff1a;远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的思想。 作者&#xff1a;李金葵 RPC(Remote Procedure Call)&#xff1a;远程过程调用&#xff0c;它是一种通过网络从远…

win7NVIDIA显卡驱动升级时卡住

可以先装上.NET framework&#xff0c;再更新就不会卡了转载于:https://www.cnblogs.com/haizine/p/10950442.html

[Leetcode][第116 117题][JAVA][填充每个节点的下一个右侧节点指针][BFS][链表前驱节点]

【问题描述】[中等] 【解答思路】 1. BFS层次遍历思想 &#xff08;通用&#xff09; 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) public Node connect(Node root) {if (root null)return root;Queue<Node> queue new LinkedList<>();queue.add(r…

Windows Server2012 R2 无法安装.NET Framework 3.5的解决方法

Windows server 2012R2&#xff0c;自带的是.NET Framework 4.5,如果想装SQL server2008或者SQL server2012就需要安装 .ENT Framework 3.5或者2.0的版本&#xff0c;建议安装 .NET3.5 版本&#xff0c;我本人亲测过&#xff0c;成功了&#xff01; 安装不成功错误分析&#x…

第三十五期:网络爬虫是啥玩意儿?有什么用呢?

在这个用数据说话的时代&#xff0c;数据是一件极其重要的事情&#xff0c;怎样才能抓取到完整以及全面的数据呢&#xff1f;这并不是一件容易的事情。 作者&#xff1a;呦呦科学馆 如果想要做好大数据的分析&#xff0c;单单依靠一己之力或者是周边的数据是远远不够的&#x…

121 Best Time to Buy and Sell Stock

输入&#xff1a;一个数组prices,prices[i]表示第i天股票的价格。 输出&#xff1a;买卖股票的最大收益。 规则&#xff1a;只允许最多买一次&#xff0c;最多卖一次股票。如果觉得价格不合适&#xff0c;可以不买卖。 分析1&#xff1a;最先想到的是暴力搜索&#xff0c;每天都…

第三十六期:学 Java 网络爬虫,需要哪些基础知识?

说起网络爬虫&#xff0c;大家想起的估计都是 Python &#xff0c;诚然爬虫已经是 Python 的代名词之一&#xff0c;相比 Java 来说就要逊色不少。有不少人都不知道 Java 可以做网络爬虫&#xff0c;其实 Java 也能做网络爬虫而且还能做的非常好&#xff0c;在开源社区中有不少…

前端之盒子模型

CSS之盒子模型 margin: 用于控制元素与元素之间的距离&#xff1b;margin的最基本用途就是控制元素周围空间的间隔&#xff0c;从视觉角度上达到相互隔开的目的。padding: 用于控制内容与边框之间的距离&#xff1b;Border(边框): 围绕在内边距和内容外的边框。Content(内容): …

[Leetcode][第977题][JAVA][有序数组的平方][排序][双指针]

【问题描述】[简单] 【解答思路】 1. 排序 平方后排序 没有使用排序的特性 时间复杂度&#xff1a;O(NlogN) 空间复杂度&#xff1a;O(1) class Solution {public int[] sortedSquares(int[] A) {int[] ans new int[A.length];for (int i 0; i < A.length; i) {ans[i] …