Java用SAX和DOM解析器解析Xml

SAX解析

SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口

teachers.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<teachers>
    <teacher id="1">
    	<name>张三</name>
    	<course>数学</course>
    	<age>29</age>
    </teacher>
    <teacher id="2">
    	<name>李四</name>
    	<course>外语</course>
    	<age>22</age>
    </teacher>
     <teacher id="3">
    	<name>王五</name>
    	<course>语文</course>
    	<age>28</age>
    </teacher>
</teachers>

Teacher对象类

package teacherbo;

public class Teacher {
	private String id;
	private String name;
	private String course;
	private int age;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCourse() {
		return course;
	}
	public void setCourse(String course) {
		this.course = course;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Teacher(String id, String name, String course, int age) {
		super();
		this.id = id;
		this.name = name;
		this.course = course;
		this.age = age;
	}
	public Teacher() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Teacher [id=" + id + ", name=" + name + ", course=" + course
				+ ", age=" + age + "]";
	}
	
	
}

interface XmlTeacherPerse接口类

package teacherbo;

import java.util.List;

public interface XmlTeacherPerse {
	public List<Teacher> teacherParseXml(String fileName);
}

MySaxHandlerTeacher解析类:

package teachersax;

import java.util.ArrayList;
import java.util.List;

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

public class MySaxHandlerTeacher extends DefaultHandler {
	private String tag;//标记元素
	private Teacher teacher;
	private List<Teacher> list;//容器
	//返回list
	public List<Teacher> getList(){
		return list;
	}
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		//第一步,
		list=new ArrayList<Teacher>();//创建一个Teacher类型的对象放到list容器中
	}
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
	}
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		//第二步
		if(qName.equals("teacher")){
			teacher=new Teacher();//创建一个Teacher对象
			String id=attributes.getValue("id");//获取id的值
			teacher.setId(id);
		}
		tag=qName;//标记第几个teacher
	}
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		super.endElement(uri, localName, qName);
		//第三部解析
		if(qName.equals("teacher")){
			list.add(teacher);//添加到容器list中
			teacher=null;//刷新本次teacher值
		}
		tag=null;//刷新本次标记的值,为不影响写一次解析标记的值
	}
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		//第四步:解析内容
		if(tag!=null){
			//返回字符串的副本,忽略前导空白和尾部空白。
			String str=new String(ch, start, length).trim();
			if(tag.equals("name")){
				teacher.setName(str);
			}
			if(tag.equals("course")){
				teacher.setCourse(str);
			}
			if(tag.equals("age")){
				//强制类型转换
				teacher.setAge(Integer.parseInt(str));
			}
		}
	}
	
	
}

SaxParserTeacher解析,测试类

package teachersax;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

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

import org.xml.sax.SAXException;

import teacherbo.Teacher;
import teacherbo.XmlTeacherPerse;

public class SaxParserTeacher implements XmlTeacherPerse {
	public static void main(String []args){
		//接口创建实现类对象
		XmlTeacherPerse perser=new SaxParserTeacher();
		List<Teacher> list=perser.teacherParseXml("teachers.xml");//解析对象
		System.out.println("SAX解析结果");
		for(Teacher teacher:list){
			System.out.println(teacher);
		}
	}
	//接口类中的实现
	@Override
	public List<Teacher> teacherParseXml(String fileName) {
		List<Teacher> list=new ArrayList<Teacher>();//创建一个Teacher类型的容器
		//获取 SAXParserFactory 的一个新实例。
		SAXParserFactory factory=SAXParserFactory.newInstance();
		MySaxHandlerTeacher handler=null;//创建一个MySaxHandlerTeacher对象,赋值为空
		try {
			//使用当前配置的工厂参数创建 SAXParser 的一个新实例,返回类型是SAXParser
			SAXParser parser=factory.newSAXParser();
			//创建一个文件
			InputStream is=new FileInputStream(fileName);
			//创建MySaxHandlerTeacher对象
			handler=new MySaxHandlerTeacher();
			// 使用指定的 DefaultHandler 将指定文件的内容解析为 XML。
			parser.parse(is, handler);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParserConfigurationException 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();
		}
		list=handler.getList();//返回List类型的容器Teacher
		return list;//返回list
	}

}

DOM解析

Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件
package domteacher;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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

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

import teacherbo.Teacher;
import teacherbo.XmlTeacherPerse;

public class DomTeacherXmlParser implements XmlTeacherPerse {
	public static void main(String[] args) {
		XmlTeacherPerse perser=new DomTeacherXmlParser();
		List<Teacher> list=perser.teacherParseXml("teachers.xml");
		System.out.println("解析结果:");
		for(Teacher teacher:list){
			System.out.println(teacher);
		}
		
	}
	@Override//DOM解析Xml
	public List<Teacher> teacherParseXml(String fileName) {
		List<Teacher> list=new ArrayList<Teacher>();
		//创建一个工厂
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		Document document=null;
		try {
			//使用当前参数创建一个DocumentBuilder实例
			DocumentBuilder builder=factory.newDocumentBuilder();
			//将给定文件的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。
			document=builder.parse(fileName);
		} catch (ParserConfigurationException 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();
		}
		//这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点。,Element强制类型转化成Node
		Node rootNode=(Node)document.getDocumentElement();
		//获得<teacher>元素列表,getChildNodes()包含此节点的所有子节点的 NodeList。
		NodeList teacherElementList=rootNode.getChildNodes();
		for(int i=0;i<teacherElementList.getLength();i++){
			Node teacherelement=(Node)teacherElementList.item(i);
			if(teacherelement.getNodeName().equals("teacher")){
				Teacher teacher=new Teacher();
				//getAttributes()包含此节点的属性的 NamedNodeMap(如果它是 Element);否则为 null。
				NamedNodeMap map=teacherelement.getAttributes();
				// getNamedItem("id")检索通过名称指定的节点。
				Node idNode=(Node)map.getNamedItem("id");
				//getNodeValue()此节点的值,取决于其类型
				String idString=idNode.getNodeValue();
				teacher.setId(idString.trim());
				NodeList subTeacherElementList=teacherelement.getChildNodes();
				for(int j=0;j<subTeacherElementList.getLength();j++){
					Node subElementNode=(Node)subTeacherElementList.item(j);
					String subElementNameString=subElementNode.getNodeName();
					if(subElementNameString.equals("name")){
						//获得内容name
						teacher.setName(subElementNode.getTextContent().trim());
					}
					if(subElementNameString.equals("course")){
						//获得内容course
						teacher.setCourse(subElementNode.getTextContent().trim());
					}
					if(subElementNameString.equals("age")){
						//获得内容age,强制类性转换
						teacher.setAge(Integer.parseInt(subElementNode.getTextContent().trim()));
					}
				}
				list.add(teacher);
			}
		}
		return list;
	}
}


新手求指教:注释纯属个人理解,希望各位大神留下意见.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饕餮幻想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值