[置顶] 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)附图 

[置顶] XML之Dom解析XML实例_第1张图片



(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





你可能感兴趣的:([置顶] XML之Dom解析XML实例)