Java解析XML文件——DOM解析


    DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对
这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
    DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制
表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
    DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,
因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的

具体示例:
(1)xml文件内容:在工程跟目录下建立xml/data1.xml文件,内容如下:
<students>
	<student>
		<name sex="man">小明</name>
		<nickName>明明</nickName>
		<age>20</age>
		<address>北京</address>
	</student>
	<student>
		<name sex="woman">小红</name>
		<nickName>红红</nickName>
		<age>20</age>
		<address>上海</address>
	</student>
	<student>
		<name sex="man">小亮</name>
		<nickName>亮亮</nickName>
		<age>30</age>
		<address>广州</address>
	</student>
	<student-0>
		<name sex="man">小亮-0</name>
		<nickName>亮亮-0</nickName>
		<age>200</age>
		<address>广州-0</address>
	</student-0>
</students>


(2) 解析:
private void parseXml() {
		long startTime = System.currentTimeMillis();
		System.out.println("开始解析: " + startTime);
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.parse(xmlFile);

			// 获得student的List, 注意:这里要用xml中student,而不是students节点
			NodeList studentList = doc.getElementsByTagName("student");

			for (int i = 0; i < studentList.getLength(); i++) {
				// 获得student标签
				Node node = studentList.item(i);
				// 获得student标签里面的标签
				NodeList childNode = node.getChildNodes();

				// 新建student对象
				Bean1 bean = new Bean1();
				// 遍历student标签里面的标签
				for (int j = 0; j < childNode.getLength(); j++) {
					Node item = childNode.item(j);
					if (item.getNodeName().equals("name")) {
						bean.setName(item.getTextContent());

						// 获取name节点的属性
						NamedNodeMap map = item.getAttributes();
						// 获取sex属性,由于只有一个属性,所以取0
						Node sexNode = map.item(0);
						bean.setSex(sexNode.getTextContent());
					} else if (item.getNodeName().equals("nickName")) {
						bean.setNickName(item.getTextContent());
					} else if (item.getNodeName().equals("age")) {
						bean.setAddress(item.getTextContent());
					} else if (item.getNodeName().equals("adress")) {
						bean.setAddress(item.getTextContent());
					}
				}
				
				datas.add(bean);
			}

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		long finishTime = System.currentTimeMillis();
		long time = finishTime - startTime;
		System.out.println("结束解析: " + finishTime + "\nDom解析耗时:" + time);
		
		for(Bean1 student : datas){
			System.out.println(student.toString());
		}
	}


demo传送门:

https://github.com/215836017/ParseXML_java

https://github.com/215836017/ParserXML_android


注:上面Java的demo中用到的xml文件是当前目录下的xml/data1.xml文件。result.xml是生成的文件。data2.xml, data3.xml是用来比较解析时间的。
    Android的demo中用到xml文件是存放在手机根目录下的data1.xml文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值