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
- Java用SAX和DOM解析器解析Xml
- XML 解析---dom解析和sax解析
- Java用dom和sax解析xml代码(Jaxp)
- java dom、sax解析XML
- java dom、sax解析xml
- 解析xml:DOM 和 SAX
- Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)
- Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)
- Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)
- Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)
- Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)
- DOM 解析和SAX解析 XML 文档
- XML的SAX解析和DOM解析
- dom,sax解析xml
- XML-DOM SAX解析
- xml解析,dom/sax
- Java解析xml的主要解析器: SAX和DOM的选择
- JAVA Web 开发之DOM和SAX解析XML文件
- Android studio 使用JitPack发布library到Github开源库
- 使用PR_GET_NO_NEW_PRIVS 避免安全漏洞
- Android Studio Failed to complete Gradle execution
- Time类中的运算符重载(3)-前置++,后置++
- Linux下计划任务 crontab
- Java用SAX和DOM解析器解析Xml
- 单调队列 HDU 3530 Subsequence
- 【GDOI2014模拟】旅行(水法)
- ViewPropertyAnimator源码分析
- AndroidEventBus使用----基本操作(1)
- hiho 98 搜索一 24点
- eclipse中新建Java工程的三个JRE选项区别
- Java单例设计模式的几种写法
- Java float保留两位小数或多位小数