XML解析之DOM解析和SAX解析

XML

基础知识

XML:Extensible Markup Language(可扩展标记语言),一种用来存储和传输数据的源语言。

XML的作用:存储数据和传输数据

XML与HTML的区别:

  1. HTML由W3C规范和定义;
  2. XML可由用户自定义;
  3. XML定义和规范了HTML。

XML的优点:

  1. XML简化了数据的传输;
  2. XML简化了数据的共享;
  3. XML简化了平台的变更。

XML的解析方法

DOM解析(Document Object Model)

DOM解析:通过在内存中生成DOM树进行解析,它会将整个XML文件一次性装载进内存,然后进行解析,对内存的压力比较大,不适合解析大型XML文件。

DOM解析的优缺点:

优点:方便进行遍历及操作节点

缺点:对内存压力大

DOM解析XML实例:

jdbc.xml文件

<?xml version="1.0" encoding="utf-8"?>
<jdbc>
	<config><key>url</key><value>jdbc:oracle:thin:@localhost:1521:ORACLE</value></config>
	<config><key>username</key><value>scott</value></config>
	<config><key>password</key><value>tiger</value></config>
	<config><key>driver</key><value>oracle.jdbc.OracleDriver</value></config>
</jdbc>

DOM解析XML工具类

package com.csdn.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

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

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * XMLDomParseUtil:Dom解析XML文件的工具类
 * @author Gansuper
 * @time 2014年5月10日
 */
public class XMLDomParseUtil {
	/**
	 * @功能 解析XML文件
	 * @return Map<String,String>
	 */
	public static Map<String,String> domParseXML(){
		Map<String,String> map = null;
		//获得DocumentBuilderFactory对象实例
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document document = db.parse("src/com/csdn/util/jdbc.xml");
			NodeList config = document.getElementsByTagName("config");
			map = new HashMap<String, String>();
			for(int i=0;i<config.getLength();i++){
				//获得节点
				Node node = config.item(i);
				//获得第一个子节点
				Node fnode = node.getFirstChild();
				String key = fnode.getTextContent();
				//获得下一个兄弟节点
				Node nnode = fnode.getNextSibling();
				String value = nnode.getTextContent();
				map.put(key, value);
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return map;
	}
	public static void main(String[] args) {
		Map<String,String> map = domParseXML();
		String url = map.get("url");
		System.out.println(url);
		String username = map.get("username");
		System.out.println(username);
		String password = map.get("password");
		System.out.println(password);
		String driver = map.get("driver");
		System.out.println(driver);
	}
}

SAX解析(Simple API For XML)

SAX解析:一种流式解析,边读取xml文件边解析,解析服务器内存压力比较小,适合解析比较大型的xml文件。

SAX解析的优缺点:

优点:速度快,内存无压力

缺点:不能对节点进行操作

SAX解析实例:

config.xml文件

<?xml version="1.0" encoding="utf-8"?>
<jdbc>
	<config url = "jdbc:oracle:thin:@localhost:1521:ORACLE" 
			username = "scott" 
			password = "tiger" 
			driver = "oracle.jdbc.OracleDriver">
	</config>
</jdbc>

SAX解析XMl文件工具类

package com.csdn.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * XMLSaxParseUtil:SAX解析XML文件工具类
 * @author Gansuper
 * @time 2014年5月10日
 */
public class XMLSaxParseUtil extends DefaultHandler{

	private Map<String,String> map = new HashMap<String,String>();
	private String element = null;
	private String value = null;
	
	public Map<String, String> getMap() {
		return map;
	}
	
	@Override
	public void startDocument() throws SAXException {
		System.out.println("Start Document !");
	}
	/**
	 * @param uri 表示当前标签的命名空间
	 * @param localName 表示当前文档的本地名称
	 * @param name 表示标签名称
	 * @param attributes 属性数组
	 * @throws SAXException 
	 * */
	@Override
	public void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {
		System.out.println(name + " start element !");
		for(int i=0;i<attributes.getLength();i++){
			element = attributes.getQName(i);
		    value = attributes.getValue(i);
			System.out.println(element+" = "+value);
			map.put(element, value);
		}
	}
	/**
	 * @param ch 当前标签的标签体内容
	 * @param start 标签体内容的开始位置
	 * @param length 当前标签体内容的长度
	 * @throws SAXException 
	 * */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {

	}
	/**
	 * @param uri 表示当前标签的命名空间
	 * @param localName 表示当前文档的本地名称
	 * @param name 表示标签名称
	 * @throws SAXException 
	 * */
	@Override
	public void endElement(String uri, String localName, String name)throws SAXException {
		System.out.println(name + " end element !");
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("End Document !");
	}
	
	public static void main(String[] args) {
		try {
			SAXParserFactory spf = SAXParserFactory.newInstance();
			SAXParser sp = spf.newSAXParser();
			XMLSaxParseUtil handler = new XMLSaxParseUtil();
			sp.parse("src/com/csdn/util/config.xml", handler);
			Map<String,String> map = handler.getMap();
			String url = map.get("url");
			System.out.println("url = "+url);
			String username = map.get("username");
			System.out.println("username = "+username);
			String password = map.get("password");
			System.out.println("password = "+password);
			String driver = map.get("driver");
			System.out.println("driver = "+driver);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值