XML解析之DOM解析和SAX解析

来源:互联网 发布:h1 seo 编辑:程序博客网 时间:2024/04/30 08:20

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;}@Overridepublic void startDocument() throws SAXException {System.out.println("Start Document !");}/** * @param uri 表示当前标签的命名空间 * @param localName 表示当前文档的本地名称 * @param name 表示标签名称 * @param attributes 属性数组 * @throws SAXException  * */@Overridepublic 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  * */@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {}/** * @param uri 表示当前标签的命名空间 * @param localName 表示当前文档的本地名称 * @param name 表示标签名称 * @throws SAXException  * */@Overridepublic void endElement(String uri, String localName, String name)throws SAXException {System.out.println(name + " end element !");}@Overridepublic 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 0
原创粉丝点击