`
zyoohoo
  • 浏览: 5648 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

xml解析

 
阅读更多

一、前言

用Java解析XML文档,最基本的有两种方法:

1.使用基于事件的XML简单API(Simple API for XML)称为SAX

2.基于树和节点的文档对象模型(Document Object Module)称为DOM。

Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。

 

JAXP接口包含了三个包: 
  (1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
  (2)org.xml.sax  用于对XML进行语法分析的事件驱动的XML简单API(SAX)
  (3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。

 

二、比较

1、 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频繁的改变的服务中。

 

2、 SAX 解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。 

三、使用DOM解析XML文档

DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以满意条件了。

 

 

<?xml version="1.0" encoding="UTF-8"?>
<people>
    <person>
        <name>蒋中正</name>
        <sex>male</sex>
        <age>25</age>
    </person>
    <person>
        <name>毛润之</name>
        <sex>female</sex>
        <age>22</age>
    </person>
    <person>
        <name>孙中山</name>
        <sex>male</sex>
        <age>28</age>
    </person>
</people>

 

解析XML代码如下:

 

 

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;


/***
 * DOM解析
 * */
public class XmlParsing {
	
	public XmlParsing(){
		//1、获得DOM解析器的工厂实例------工厂实例
		DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
		try {
			
			//2、从DOM工厂获得DOM解析器------dom解析器
			DocumentBuilder dombuilder = domfac.newDocumentBuilder();
			//3、把要解析的XML文档转化为输入流,以便DOM解析器解析它
			InputStream in = XmlParsing.class.getClassLoader().getResourceAsStream("people.xml");
			//4、解析XML文档的输入流,得到一个Document
			Document doc = dombuilder.parse(in);
			//5、得到XML文档的根节点
			Element root = doc.getDocumentElement();
			//6、得到节点的子节点
			NodeList persons = root.getChildNodes();
			for(int i=0;i<persons.getLength();i++){
				
				Node person = persons.item(i);
				//获得节点的属性值
				if(person.getNodeType()==Node.ELEMENT_NODE){
					String id = person.getAttributes().getNamedItem("id").getNodeValue();
					System.out.print("编号:"+id);	
				}
				for(Node node = person.getFirstChild();node!=null;node = node.getNextSibling()){
					//DOM把<name>蒋中正</name>也当作是两层结构的节点,其父节点是<name>,
					//子节"蒋中正" 记才是我们真正想得到的
//					System.out.println(node.getNodeValue());//**Output**: NULL ,
					if(node.getNodeType()==Node.ELEMENT_NODE){
						if(node.getNodeName().equals("name")){
							System.out.println("  姓名:"+node.getFirstChild().getNodeValue());
						}
					}
				}
				
			}
			
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

 

 

import java.io.InputStream;
import java.util.Iterator;

import org.dom4j.*;
import org.dom4j.io.SAXReader;

public class Dom4jParsing {
	
	@SuppressWarnings("unchecked")
	public static void parseXml(String rootName,String id){
		//把要解析的XML文档转化为输入流,以便DOM解析器解析它
		InputStream in = Dom4jParsing.class.getClassLoader().getResourceAsStream("people.xml");
		//获取SAX解析器
		SAXReader reader = new SAXReader();
		
		try {
			//解析文档输入流,得到一个doc文档
			Document doc = reader.read(in);
			Element root = doc.getRootElement();
			for(Iterator<Element> iter = root.elementIterator();iter.hasNext();){
				//获得根元素下的字根元素
				Element e = iter.next();
				//获得节点的属性值
				System.out.println("编号:"+e.attributeValue(id));
				if(e.getName()==rootName){
					//当前节点下的子节点
					for(Iterator<Element> iter1 = e.elementIterator();iter1.hasNext();){
						
						System.out.println(iter1.next().getText());
					}
				}
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		
	}
	
	public static void main(String[] args) {
		Dom4jParsing.parseXml("person","id");
	}
}

 

 

DOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义:

 

Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP.

 

Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics