Java用SAX和DOM解析器解析Xml

来源:互联网 发布:禁止上网软件 编辑:程序博客网 时间:2024/05/16 14:30

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}@Overridepublic 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;//容器//返回listpublic List<Teacher> getList(){return list;}@Overridepublic void startDocument() throws SAXException {super.startDocument();//第一步,list=new ArrayList<Teacher>();//创建一个Teacher类型的对象放到list容器中}@Overridepublic void endDocument() throws SAXException {super.endDocument();}@Overridepublic 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}@Overridepublic 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;//刷新本次标记的值,为不影响写一次解析标记的值}@Overridepublic 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);}}//接口类中的实现@Overridepublic List<Teacher> teacherParseXml(String fileName) {List<Teacher> list=new ArrayList<Teacher>();//创建一个Teacher类型的容器//获取 SAXParserFactory 的一个新实例。SAXParserFactory factory=SAXParserFactory.newInstance();MySaxHandlerTeacher handler=null;//创建一个MySaxHandlerTeacher对象,赋值为空try {//使用当前配置的工厂参数创建 SAXParser 的一个新实例,返回类型是SAXParserSAXParser 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 blocke.printStackTrace();} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}list=handler.getList();//返回List类型的容器Teacherreturn 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解析Xmlpublic 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 blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点。,Element强制类型转化成NodeNode 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")){//获得内容nameteacher.setName(subElementNode.getTextContent().trim());}if(subElementNameString.equals("course")){//获得内容courseteacher.setCourse(subElementNode.getTextContent().trim());}if(subElementNameString.equals("age")){//获得内容age,强制类性转换teacher.setAge(Integer.parseInt(subElementNode.getTextContent().trim()));}}list.add(teacher);}}return list;}}


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




0 0
原创粉丝点击