XML之Dom解析XML实例

--------------------------------------------XML之Dom解析XML------------------------------------------


一:概述
Dom解析(Document Object Mode)是一种基于对象的API,它把XML的内容加载到内存中,生成一个与XML文档内容对应的对象模型。当解析完成时,内存中会生成与XML文档的结构对应的DOM对象树。这样便能够根据树的结构,以节点的形式对文档进行操作。解析XML文件要比解析字符串、解析properties文件复杂的多,需要构建不止一个工具类对象。下面看一个使用DOM解析数据的程序,代码如下。

(1) music.xml
<?xml version="1.0" encoding="UTF-8"?>
<musics>	
	<music category="摇滚">
	 <name>江南style</name>
	 <author>PSY</author>
	 <county>韩国</county>
	 <date>20121205</date>
	</music>
	
	<music category="摇滚">
	 <name>航母style</name>
	 <author>网民</author>
	 <county>中国</county>
	 <date>20121205</date>
	</music>
</musics>




(2)DomXML.java
package com.test;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomXML {

	
	public static void main(String[] args) {
		
		//创建解析的XML 文档对象   
		File xmlFile=new File("music.xml");
	    //声明一个 DocumentBuilder 对象  ,抽象类不能直接构建 ,可以通过DocumentFactory 来构建  
		DocumentBuilder builder=null;
		//声明一个DocumentBuilderFactory 对象 ,通过单例模式创建  
		DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
		 
		try {
			//取得默认的 DocumentBuilder
			builder=builderFactory.newDocumentBuilder();
			//解析文件  
			Document document  =builder.parse(xmlFile);
			//获得根元素  
			Element root =document.getDocumentElement();
			System.out.println("根元素:"+root.getNodeName());
			//获得根元素下的子节点  
			NodeList childNodes=root.getChildNodes();
			
			//遍历这些子节点  对每个子节点进行判断   
			for (int i = 0; i < childNodes.getLength(); i++) {
				
				Node node=childNodes.item(i);
				//如果节点名称为“airticle” 输出airticle 元素的属性category 
				if("music".equals(node.getNodeName())){
					System.out.println("\r\n找到一首歌.所属分类:"+node.getAttributes().
							getNamedItem("category").getNodeValue()+".");
					
					NodeList nodeDetail= node.getChildNodes();
					
					for (int j = 0; j < nodeDetail.getLength(); j++) {
					   Node detail=	nodeDetail.item(j);
						
					   if("name".equals(detail.getNodeName())){
						   System.out.println("歌名:"+detail.getTextContent());
					   }else if("author".equals(detail.getNodeName())){
						   System.out.println("歌手:"+detail.getTextContent());
					   }else if("county".equals(detail.getNodeName())){
						   System.out.println("国家:"+detail.getTextContent());
					   }else if("date".equals(detail.getNodeName())){
						   System.out.println("发布日期:"+detail.getTextContent());
					   }
						
					}
					
				}
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		
		
		
	}
	
}





(3)附图





(4) 通过以上程序,可以总结出使用DOM 解析XML时,需要注意的问题。
1,首先要通过以下三个步骤创建XML文件对应的Document对象。
//获取factory
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//获取builder
DocumentBuilder builder=builderFactory.newDocumentBuilder();
//解析为document 对象
Document document=builder.parse(xmlFile);

2,获取Document对象之后就可以通过Document的各种方法遍历整个XML内容了。


注意,XML解析只负责解析正确的XML,而不负责判断XML是否合法,更不会纠正XML语法错误,如果一个XML文件不符合语法,XML解析器会直接抛出解析异常。


缺点:
DOM解析的时候会把整个XML文件全部映射为Document里的树状结构,换言之,取到XML里的每个元素、属性、文本、注释都在Document 里有所体现。对于小的XML文件来说这样处理还是很方便的,但是当遇到比较大的XML文件的时候,DOM的缺点就显而易见了,它的内存占用比较大,而且查找速度比较慢。那怎么解决呢?别急,解析XML还有一种选择就是SAX,具体怎么做,请看下回分解。

author:huahuagongzi9999





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值