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

XML语言数据读写理解3

首先先把我们要读取的xml文件搞上来:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Appearance>
<ROOT>
<Mode>
	<firstEle>
		<A id = "1">
			<T param1="42323" param2="2356" param3= "3d2"/>
			<R param1="6256" param2="23562" param3= "f232f"/>
		</A> <!-- childNode.nextSibling() 寻找下一个兄弟节点 -->
		<A id = "2">
			<R param1="433f3f" param2="frsfs" param3= "f2g34g"/>
			<R param1="243442" param2="324232" param3= "j665"/>
		</A>
		<B id = "3">
			<B param1="sdfsdfs" param2="fef2" param3= "43tg"/>
			<W param1="123123" param2="32ff" param3= "efea"/>
		</B>
	</firstEle>
	<secondEle>
		<C id = "4">
			<B param1="143221" param2="kyr5y" param3= "fwf"/>
			<B param1="124531" param2="4g4gs" param3= "4w4g"/>
		</C>
		<D id = "5">
			<B param1="13231233" param2="3qfgg" param3= "44444tw"/>
			<B param1="45435" param2="aacevev" param3= "dghh"/>
		</D>
	</secondEle>
</Mode>
<Mode2>
	<firstEle2>
		<A id = "1">
			<T param1="42323" param2="2356" param3= "3d2"/>
			<R param1="6256" param2="23562" param3= "f232f"/>
		</A> <!-- childNode.nextSibling() 寻找下一个兄弟节点 -->
		<A id = "2">
			<R param1="433f3f" param2="frsfs" param3= "f2g34g"/>
			<R param1="243442" param2="324232" param3= "j665"/>
		</A>
		<B id = "3">
			<B param1="sdfsdfs" param2="fef2" param3= "43tg"/>
			<W param1="123123" param2="32ff" param3= "efea"/>
		</B>
	</firstEle2>
	<secondEle2>
		<C id = "4">
			<B param1="143221" param2="kyr5y" param3= "fwf"/>
			<B param1="124531" param2="4g4gs" param3= "4w4g"/>
		</C>
		<D id = "5">
			<B param1="13231233" param2="3qfgg" param3= "44444tw"/>
			<B param1="45435" param2="aacevev" param3= "dghh"/>
		</D>
	</secondEle2>
</Mode2>
</ROOT>

我们简单看一下用浏览器显示的这个数据的结构:

    可以说这个XML的层次以及较为复杂了,已经比得上很多应用程序的数据结构复杂度了,那么我们就尝试一点一点将这个程序解析出来。注意第二行的<!DOCTYPE Appearance>。与设置显示有关,这里就懒得处理了。不用管它,删掉也行。

    首先,排除掉上一节讲的前两行,然后我们看到了一个ROOT节点,要注意的是,任何XML文件的根节点只能有一个!!也就是说,如果你这么写:

<ROOT>
    <Mode>
    ......
    </Mode>
    </Mode2>
    ......
    </Mode2>
</ROOT>
<ROOT2>
    <Mode3>
    ......
    </Mode3>
    </Mode4>
    ......
    </Mode4>
</ROOT2>

    使用浏览器或者任何常规的解析器就会解析错误,因为没有根节点(如果最大范围的节点有两个,它就不再是根节点了,而是普通节点,例如ROOT 和 ROOT2,同为最大范围的节点,遍都不再是根节点了。)

    利用上一节我们的程序读取了前两行版本信息以后,使用下面的程序,

	//读取根元素
	QDomElement root = xml.documentElement();
	dw->addContents("["+root.tagName()+"]");
	dw->addContents("");//再隔开一行
    //注意上一节提到过,dw->addContents(QString)是用来调试显示结果用的程序,每次调用都换一行显示

    显示结果为:

[ROOT]

    也就是说我们已经找到了根节点。接下来就可以找里面的子节点了。

    根据上图浏览器显示的结构,我们下一级的节点为Mode和Mode2,所以我们的目标就是要把这两个Mode提取出来。见程序:

    

QDomNode data = root.firstChild();
while (!data.isNull())
{	
		
	QDomElement e = data.toElement(); // try to convert the node to an element.  
	dw->addContents("[" + e.tagName() + "]");
    //再去找下一个节点
	data = data.nextSiblingElement();
}

    一看就知道,首先先把第一个子节点找出来,然后转为元素 (就是里面有数据的结构,当然这里的节点Mode和Mode2里面还是节点,所以并不算一个元素)。

    然后再把子节点的名字打印出来,然后转到下一个节点。最后的打印效果如下:

[Mode]
[Mode2]

    到现在为止,我们写过的程序打印出来的总效果:

xml
version='1.0' encoding='UTF-8'

[ROOT]

[Mode]
[Mode2]

    这一节就先讲这么多,到下一节我再讲循环把所有的节点都打印出来。

相关文章:

  • XML语言数据读写理解4
  • XML语言数据读写理解5
  • XML语言数据读写理解6
  • XML语言数据读写理解7
  • XML语言数据读写理解8
  • XML语言数据读写理解9
  • XML语言数据读写理解10
  • 简易的QT输出调试器
  • 简易的QT输出调试器2
  • XML语言数据读写理解11
  • XML语言数据读写理解12
  • XML语言数据读写理解13
  • XML语言数据读写理解14
  • XML语言数据读写理解15
  • XML语言数据读写理解16
  • centos安装java运行环境jdk+tomcat
  • Gradle 5.0 正式版发布
  • isset在php5.6-和php7.0+的一些差异
  • JS变量作用域
  • js数组之filter
  • MaxCompute访问TableStore(OTS) 数据
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Octave 入门
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • V4L2视频输入框架概述
  • 分类模型——Logistics Regression
  • 每天10道Java面试题,跟我走,offer有!
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何合理的规划jvm性能调优
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 写给高年级小学生看的《Bash 指南》
  • ​​​​​​​​​​​​​​Γ函数
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (C#)一个最简单的链表类
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (python)数据结构---字典
  • (二)PySpark3:SparkSQL编程
  • (二)学习JVM —— 垃圾回收机制
  • (译)计算距离、方位和更多经纬度之间的点
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)h264中avc和flv数据的解析
  • ./和../以及/和~之间的区别
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 版本不支持的问题
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 常见的偏门问题
  • .NET 分布式技术比较
  • .net 怎么循环得到数组里的值_关于js数组
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • [2016.7 day.5] T2
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)