XML学习笔记(一)之DOM及SAX方式解析XML原理

1.XML

    XML 指可扩展标记语言(eXtensible Markup Language)。XML 被设计用来传输和存储数据。

(1)XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。

   示例:  

<bookstore>
    <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore>

   

   在程序中常要对XML增加、修改、删除和检索,这就需要对XML进行解析

2.1  DOM解析

        DOM (文档对象模型) 解析器读入整个文档,然后构建一个驻留内存的树结构,然后通过节点以及节点之间的关系来解析xml文件,操作这个树的结构。

  • 优点:整个文档树在内存中,便于操作,支持删除、修改、重新排列等多种功能;
  • 缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间
  • 使用场合:一旦解析了文档还需多次访问这些数据,但硬件资源充足(内存、CPU).

 下面结合这个xml文件来进行dom解析。

step1:先在d盘准备一个students.xml文档

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student sn="01">
	    <name>张三</name>
		<age>18</age>
	 </student>
	 
	 <student sn="02">
	    <name>李四</name>
		<age>54</age>
	 </student>
</students>

step2:

package com.dom;

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.NodeList;
import org.w3c.dom.Text;

public class Demo05 {

	public static void main(String[] args)throws Exception {
		
		    DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
			DocumentBuilder db=dbf.newDocumentBuilder();
			Document doc=db.parse(new File("d:\\students.xml"));
			
			//增加一个学生节点
			Element student=doc.createElement("student");
			student.setAttribute("sn", "03");
			
			Element name=doc.createElement("name");
			Element age=doc.createElement("age");
			Text nametxt=doc.createTextNode("小明");
			Text agetxt=doc.createTextNode("25");
			
			name.appendChild(nametxt);
			age.appendChild(agetxt);
			
			student.appendChild(name);
			student.appendChild(age);
			
			doc.getDocumentElement().appendChild(student);
		
			//查找名为name的节点,并输出它的节点值
			NodeList names=doc.getElementsByTagName("name");
			if(null!=names&&names.getLength()>0)
			{
				for(int i=0;i<names.getLength();i++)
				{
				Element element=(Element)names.item(i);
				System.out.println(element.getFirstChild().getNodeValue());
				}
			}
	}
	

}

输出结果:

张三
李四
小明

2.2  SAX解析

        SAX是一种基于事件驱动的API。利用SAX解析XML文档,涉及到两个部分,解析器事件处理器,解析器负责读取XML文档,并向事件处理器发送事件,如元素的开始和元素的结束事件,而事件处理器则负责对事件做出响应,对传递XML数据进行处理。

  • 优点:不用事先调入整个文档,占用资源少,SAX解析器代码比DOM解析器代码小。
  • 缺点:
  1. 不是持久的,事件过后,若没保存数据,那么数据就丢了;
  2.  无状态性,只解析当前元素,无法访问之前的内容
  3. 从事件中只能得到文本,但不知道该文本属于哪个元素;
  • 使用场合:只需XML文档的少量内容,很少回头访问;机器内存少;
package com.xzy;

import java.io.File;

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

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

public class Demo01 {

	public static void main(String[] args) throws Exception
	{
		SAXParserFactory spf=SAXParserFactory.newInstance();
		
		SAXParser  parser=spf.newSAXParser();
		File f=new File("d:\\students.xml");//要读取的xml文档
		
		parser.parse(f, new MyHandler());
	}
	//自定义事件处理器
    public static class MyHandler extends DefaultHandler
    {

		@Override
		public void startDocument() throws SAXException {
		    System.out.println("开始解析文档.......................................");
		}

		@Override
		public void endDocument() throws SAXException {
			 System.out.println("结束解析文档.......................................");
		}

		@Override
		public void endElement(String uri, String localName, String qName) throws SAXException {
		    System.out.println("结束元素:"+qName);
		}

		@Override
		public void characters(char[] ch, int start, int length) throws SAXException {
			   System.out.println("文本:"+new String(ch,start,length));
		}

		@Override
		public void error(SAXParseException e) throws SAXException {
			 System.out.println("出错了。。。。。。");
		}

		@Override
		public void startElement(String uri, String localName, String qName, Attributes attributes)
				throws SAXException {
			   System.out.println("开始元素:"+qName);
		}
    	
    }
}

输出结果:

开始解析文档.......................................
开始元素:students
文本:
    
开始元素:student
文本:
	    
开始元素:name
文本:张三
结束元素:name
文本:
		
开始元素:age
文本:18
结束元素:age
文本:
	 
结束元素:student
文本:
	 
	 
开始元素:student
文本:
	    
开始元素:name
文本:李四
结束元素:name
文本:
		
开始元素:age
文本:54
结束元素:age
文本:
	 
结束元素:student
文本:

结束元素:students
结束解析文档.......................................

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值