XML语言数据读写理解4

159 阅读4分钟

接着上一节来。首先再把xml文件放一下。

image.png

我们已经能显示出两个子节点Mode和Mode2来了,但是每个子节点底下也有属于它的子节点的子节点,即Mode里的firstEle和secondEle以及Mode2里的firstEle2和secondEle2,这两个节点应该怎么读取?我想应该已经很明确了:

`

    QDomNode data = root.firstChild();
if (data.isNull()) {
	//可以跟这个文件说再见了
}
while (!data.isNull())
{	
	
	QDomElement e = data.toElement(); // try to convert the node to an element.  
	dw->addContents("[" + e.tagName() + "]");
	QDomNode numEle = data.firstChild();
	while (!numEle.isNull()) {
		QDomElement dd = numEle.toElement();
		dw->addContents("[" + dd.tagName() + "]");

		numEle = numEle.nextSiblingElement();
	}
	data = data.nextSiblingElement();
} 
 `

无非就是大循环里面套一个小循环嘛!显示如下: [Mode] [firstEle] [secondEle] [Mode2] [firstEle2] [secondEle2]

而每个firstEle以及secondEle里面都有好几个元素集,这些元素集都有值,即例如 id = "1",这些值可以用来作为每个数据的分类信息。例如你要设计一个数据显示的表格,每个人都对应了一组数据,人的序号从1排列到100,我们就设置数据的id为1到100,用来给每个人对应每套装备。

    前面的Mode和firstEle其实都可以设置一些参数的,只是为了简单没有设置,现在我们需要解析一下带参数的元素了。 ` QDomNode data = root.firstChild(); if (data.isNull()) dw->addContents("error 3"); while (!data.isNull()) {

	QDomElement e = data.toElement(); // try to convert the node to an element.  
	dw->addContents("[" + e.tagName() + "]");
	QDomNode numEle = data.firstChild();
	while (!numEle.isNull()) {
		QDomElement dd = numEle.toElement();
		dw->addContents("[" + dd.tagName() + "]");
		QDomNode ABC = numEle.firstChild();
		while (!ABC.isNull()) {
			QDomElement abc = ABC.toElement();
			dw->addContents("[" + abc.tagName() + "]" +"id: "+abc.attribute("id"));

			ABC = ABC.nextSiblingElement();
		}
		numEle = numEle.nextSiblingElement();
	}
	data = data.nextSiblingElement();
}`

大循环套中循环套小循环。

    唯一不同的是小循环里面多了这么一句:

dw->addContents("[" + abc.tagName() + "]" +"id: "+abc.attribute("id"));     这一句可以把属性值打印出来。

   之后我们发现,最小的子节点A , B 和 C里面是有元素的,我们需要用到节点列表把元素读取出来:

   

QDomNode data = root.firstChild();
if (data.isNull())
	dw->addContents("error 3");	
while (!data.isNull())
{	
	
	QDomElement e = data.toElement(); // try to convert the node to an element.  
	dw->addContents("[" + e.tagName() + "]");
	QDomNode numEle = data.firstChild();
	while (!numEle.isNull()) {
		QDomElement dd = numEle.toElement();
		dw->addContents("[" + dd.tagName() + "]");
		QDomNode ABC = numEle.firstChild();
		while (!ABC.isNull()) {
			QDomElement abc = ABC.toElement();
			dw->addContents("[" + abc.tagName() + "]" +"id: "+abc.attribute("id"));
			if (!abc.isNull())
			{
				//将当前节点<Node>的所有元素放到QDomNodeList 中,以便遍历
				QDomNodeList realData = ABC.childNodes();
				for (int i = 0; i < realData.count(); i++)
				{
					QDomNode realDatanode = realData.at(i);
					QString textname = realDatanode.toElement().tagName() + " param1: " + realDatanode.toElement().attribute("param1") +
						" param2: " + realDatanode.toElement().attribute("param2") + " param3: " + realDatanode.toElement().attribute("param3");//查询属性值
					
					dw->addContents(textname);
				}
				dw->addContents("");
			}
			ABC = ABC.nextSiblingElement();
		}
		numEle = numEle.nextSiblingElement();
	}
	data = data.nextSiblingElement();
}

    也就是说在之前的最小循环里,加了这些代码:

if (!abc.isNull()) { //将当前节点的所有元素放到QDomNodeList 中,以便遍历 QDomNodeList realData = ABC.childNodes(); for (int i = 0; i < realData.count(); i++) { QDomNode realDatanode = realData.at(i); QString textname = realDatanode.toElement().tagName() + " param1: " + realDatanode.toElement().attribute("param1") + " param2: " + realDatanode.toElement().attribute("param2") + " param3: " + realDatanode.toElement().attribute("param3");//查询属性值

	dw->addContents(textname);
}
dw->addContents("");

}     使用列表,将里面所有的子节点都放进去,也就是XML里面的:

    然后转化为元素,并将里面的属性值输出。

    注意在写整个循环的之后不要把变量名弄混了,不然调试出错以后修改很麻烦!这充分说明了好的变量名以及好的数据结构的重要性。以后我们会专门使用结构来把这些数据进行读取和存储。

输出如下:

    

[Mode] [firstEle] [A]id: 1 T param1: 42323 param2: 2356 param3: 3d2 R param1: 6256 param2: 23562 param3: f232f

[A]id: 2 R param1: 433f3f param2: frsfs param3: f2g34g R param1: 243442 param2: 324232 param3: j665

[B]id: 3 B param1: sdfsdfs param2: fef2 param3: 43tg W param1: 123123 param2: 32ff param3: efea

[secondEle] [C]id: 4 B param1: 143221 param2: kyr5y param3: fwf B param1: 124531 param2: 4g4gs param3: 4w4g

[D]id: 5 B param1: 13231233 param2: 3qfgg param3: 44444tw B param1: 45435 param2: aacevev param3: dghh

[Mode2] [firstEle2] [A]id: 1 T param1: 42323 param2: 2356 param3: 3d2 R param1: 6256 param2: 23562 param3: f232f

[A]id: 2 R param1: 433f3f param2: frsfs param3: f2g34g R param1: 243442 param2: 324232 param3: j665

[B]id: 3 B param1: sdfsdfs param2: fef2 param3: 43tg W param1: 123123 param2: 32ff param3: efea

[secondEle2] [C]id: 4 B param1: 143221 param2: kyr5y param3: fwf B param1: 124531 param2: 4g4gs param3: 4w4g

[D]id: 5 B param1: 13231233 param2: 3qfgg param3: 44444tw B param1: 45435 param2: aacevev param3: dghh     为了显示美观,我们设置显示一下每个节点的结束标志,程序如下:

QDomNode data = root.firstChild();
if (data.isNull())
	dw->addContents("error 3");	
while (!data.isNull())
{	
	
	QDomElement e = data.toElement(); // try to convert the node to an element.  
	dw->addContents("[" + e.tagName() + "]");
	QDomNode numEle = data.firstChild();
	while (!numEle.isNull()) {
		QDomElement dd = numEle.toElement();
		dw->addContents("[" + dd.tagName() + "]");
		QDomNode ABC = numEle.firstChild();
		while (!ABC.isNull()) {
			QDomElement abc = ABC.toElement();
			dw->addContents("[" + abc.tagName() + "]" +"id: "+abc.attribute("id"));
			if (!abc.isNull())
			{
				//将当前节点<Node>的所有元素放到QDomNodeList 中,以便遍历
				QDomNodeList realData = ABC.childNodes();
				for (int i = 0; i < realData.count(); i++)
				{
					QDomNode realDatanode = realData.at(i);
					QString textname = realDatanode.toElement().tagName() + " param1: " + realDatanode.toElement().attribute("param1") +
						" param2: " + realDatanode.toElement().attribute("param2") + " param3: " + realDatanode.toElement().attribute("param3");//查询属性值
					
					dw->addContents(textname);
				}
			}dw->addContents("[/" + abc.tagName() + "]");
			ABC = ABC.nextSiblingElement();
		}dw->addContents("[/" + dd.tagName() + "]");
		numEle = numEle.nextSiblingElement();
	}dw->addContents("[/" + e.tagName() + "]");dw->addContents("");
	data = data.nextSiblingElement();
}