当前位置: 首页 > news >正文

XML语言数据读写理解9

    因为篇幅原因就不把上一节的XML文件粘贴上来了,大家可以返回去看。

    现在,我们需要把所有的node都读出来,然后保存到一个容器里。要注意的一点是所有的数值都是根据NormalizedIntensity的大小进行排序的,我们存储也要按照顺序来存储,这样以后应用的时候也更方便一些。

    我们使用QList来存储,首先再Node节点底下设置一个别名:typedef QList<NodeTS> NodeTsList; 这样会以后更方便。要注意的是,下一级的节点要读出的数据中,不但要有Nodes,还有三个变量:

<DensityScale Value="100"/>
<ShadingType Value="2"/>
<GradientFactor Value="3"/>

    为了更完整性,把上一章实现的最基础文件再贴上来,这里已经进行了一些更好的修改:

#pragma once
#ifndef _COMMONXML_H__
#define _COMMONXML_H__

#include <QObject>
#include <qstring.h>
#include <QFile>   
#include <QtXml\QtXml>
#include <QtXml\QDomDocument>

class CommonXML : public QObject {
	Q_OBJECT

public:
	CommonXML& operator = (const CommonXML& Other) {
		Name = Other.Name;
		return *this;
	}
	CommonXML(const CommonXML& Other)
	{
		Name = Other.Name;
		*this = Other;
	};

private:
	QString Name;
public:
	CommonXML(QObject * parent = Q_NULLPTR);
	~CommonXML();

private:
	
};

#endif

#include "commonxml.hpp"

CommonXML::CommonXML(QObject * parent) : QObject(parent) {
	
}

CommonXML::~CommonXML() {
	
}

然后是派生类:

#pragma once
#ifndef _NODETS_H__
#define _NODETS_H__

#include <QObject>
#include <QColor.h>
#include <qlist.h>
#include "commonxml.hpp"

class NodeTS : public CommonXML {
	Q_OBJECT

public:
	NodeTS(QObject * parent = Q_NULLPTR);
	~NodeTS();
	NodeTS& operator = (const NodeTS& Other) {
		return *this;
	}
	NodeTS(const NodeTS& Other)
	{
		*this = Other;
	};

	void readNode(QDomNodeList &node);

private:
	double NormalizedIntensity;
	double Opacity;
	QColor Emission;
	

};
typedef QList<NodeTS> NodeTsList;

#endif
#include "nodets.hpp"

NodeTS::NodeTS(QObject * parent) : CommonXML(parent) {
	
}

NodeTS::~NodeTS() {
	
}

void NodeTS::readNode(QDomNodeList & nodelist)
{
	for (int i = 0; i < nodelist.count(); i++)
	{
		QDomNode node = nodelist.at(i);
		if (node.toElement().tagName() == "NormalizedIntensity") {
			NormalizedIntensity = node.toElement().attribute("value").toDouble();
		}
		else if(node.toElement().tagName() == "Opacity") {
			Opacity = node.toElement().attribute("value").toDouble();
		}
		else if (node.toElement().tagName() == "Emission") {
			Emission.setRed(Opacity = node.toElement().attribute("R").toInt());
			Emission.setGreen(Opacity = node.toElement().attribute("G").toInt());
			Emission.setBlue(Opacity = node.toElement().attribute("B").toInt());
		}
		//realDatanode.toElement().attribute("param1") +
	}

}

注意在每个文件里都加了运算符重载= ,以及拷贝构造函数。这是为了使用QList.append()函数的,因为QList加入子代码块里的新的对象需要对其进行复制,否则原对象消失了就没有了,所以需要定义拷贝构造函数。

然后我们现在的意义是先把所有的数据先都读出来,然后存储到我们需要的列表里,最后我们要直接从QList里面取数据,而不是直接从QDomdocument以及QDomElement里面读取。(注意我们的目的是拿出来并使用这些数据,而不是把它们存在xml文件结构里面!)

之后我们再派生一个类:

#pragma once
#ifndef __TSFUNITEM_H__
#define __TSCUNITEM_H__

#include <QObject>
#include "nodets.hpp"

class TsfunItem : public QObject {
	Q_OBJECT

public:
	TsfunItem(QObject * parent = Q_NULLPTR);
	~TsfunItem();
	TsfunItem& operator = (const TsfunItem& Other) {
		return *this;
	}
	TsfunItem(const TsfunItem& Other)
	{
		*this = Other;
	};


	void readTsfunItem(QDomNodeList &nodes);
	int returnNumOfNodes(void) {
		return numOfNodes;
	}
private:
	int numOfNodes;
	NodeTsList TsNodes;
	double DensityScale;
	double ShadingType;
	double GradientFactor;
};

typedef QList<TsfunItem> TsfunItemList;
#endif

    还有操作符重载和拷贝构造函数,原因同上。在私有成员里面有所有子节点的信息。我们就只先考虑这么多内容。

    之后我们的目标就是把XML里面的两个TsfunItem中的任何一个都能读入。注意readTsfunItem接收的参数也是节点列表形式的。

    之后我们完善函数:

#include "tsfunitem.hpp"

TsfunItem::TsfunItem(QObject * parent) : QObject(parent) {
	
}

TsfunItem::~TsfunItem() {
	
}

void TsfunItem::readTsfunItem(QDomNodeList & nodes)
{
	for (int i = 0; i < nodes.count(); i++)
	{
		QDomNode childNode = nodes.at(i);
		if (childNode.toElement().tagName() == "Nodes") {
			QDomNodeList nodeData = childNode.childNodes();
			for (int i = 0; i < nodeData.count(); i++)
			{
				NodeTS nodets;
				nodets.readNode(nodeData.at(i).childNodes());
				TsNodes.append(nodets);
			}
			numOfNodes = TsNodes.count();
		}
		else if (childNode.toElement().tagName() == "DensityScale") {
			DensityScale = childNode.toElement().attribute("value").toDouble();
		}
		else if (childNode.toElement().tagName() == "ShadingType") {
			ShadingType = childNode.toElement().attribute("value").toDouble();
		}
		else if (childNode.toElement().tagName() == "GradientFactor") {
			GradientFactor = childNode.toElement().attribute("value").toDouble();
		}
		
	}

}

如果之前认真看我前面写的内容的话,这里一看就非常易懂:遍历节点,然后分别吧Nodes和其他数据量进行处理,用了if-else结构。

唯一的区别是for里面的三句话:

NodeTS nodets;
nodets.readNode(nodeData.at(i).childNodes());
TsNodes.append(nodets);

这三句话的目标就是为了把子节点的数据存储到Nodes的List里面。之后再通过赋值numOfNodes = TsNodes.count();得到节点数目。下一节就把整个文件都读进来然后显示一些信息。

 

 

相关文章:

  • XML语言数据读写理解10
  • 简易的QT输出调试器
  • 简易的QT输出调试器2
  • XML语言数据读写理解11
  • XML语言数据读写理解12
  • XML语言数据读写理解13
  • XML语言数据读写理解14
  • XML语言数据读写理解15
  • XML语言数据读写理解16
  • QT图形显示和处理1
  • QT图形显示和处理2 坐标系统(重点)
  • QT图形显示和处理3 坐标系统(重点)
  • QT图形显示和处理4
  • QT图形显示和处理5
  • QT图形显示和处理6
  • “大数据应用场景”之隔壁老王(连载四)
  • css选择器
  • Elasticsearch 参考指南(升级前重新索引)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Map集合、散列表、红黑树介绍
  • Vue.js 移动端适配之 vw 解决方案
  • Vue实战(四)登录/注册页的实现
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 聚簇索引和非聚簇索引
  • 你不可错过的前端面试题(一)
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • nb
  • 1.Ext JS 建立web开发工程
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #图像处理
  • (30)数组元素和与数字和的绝对差
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (function(){})()的分步解析
  • (笔试题)分解质因式
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (一)为什么要选择C++
  • (转)c++ std::pair 与 std::make
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .NET 8.0 中有哪些新的变化?
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .Net 高效开发之不可错过的实用工具
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CISCN2019 华东北赛区]Web2
  • [Java]快速入门二叉树,手撕相关面试题