Java解析XML 一.SAX 方式

来源:互联网 发布:安阳淘宝电商摄影 编辑:程序博客网 时间:2024/05/29 03:57

</pre><span style="font-size:24px;"></span><p></p><pre name="code" class="html">
Java中解析 XML有三种方式,SAX,Pull,DOm

一:SAX解析:这是一种基于事件驱动的解析方式,它的工作方式是自动将时间推入注册的时间处理器进行处理,  不能控制事件处理器进行处理。SAX解析 需要一个解析器, 解析器的是通过调用java提供的静态工厂          SAXParserFatory获得。还需要一个时间处理器,在处理器中定义了解析过程中的各个事件, java中提供了一个DefaultHandler类,它实现了ContentHandler中的方法,一般我们通过定义一个类继承DefaultHandler方法,再在重载中的方法编写各个流程需要处理的代码。

步骤:1.编写XML文件

  2.根据XML文件,运用面向对象的知识,封装成一个对应的类。

   3. 编写自定义的 继承DefualtHandler类,在重载的各个方法中处理流程

   4.在程序中 实例化一个SAX工厂, 实例化SAXParser解析器对象

   5.创建XMl文件的读取流

           6.解析文件

实例代码

User.xml文件

<?xml version="1.0" encoding="UTF-8"?><persons><person id="worker1"><name>Zxw</name><age>22</age><sex>boy</sex></person><person id="worker2"><name>Jxq</name><age>23</age><sex>girl</sex></person></persons>


根据User.xml文件创建的Person类

package com.zxw.sax1;public class Person {private String id;private int age;private String name;private String sex;public Person(){}public Person(String id, int age, String name, String sex) {super();this.id = id;this.age = age;this.name = name;this.sex = sex;}public String getId() {return id;}public void setId(String id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Person [id=" + id + ", age=" + age + ", name=" + name + ", sex=" + sex + "]";}}



定义 自定义的Handler

package com.zxw.sax1;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class MyHandler extends DefaultHandler{private List<Person> list;private Person person;// 存储读取到标签时,当时的标签名,以便在另一个函数characters()中为 person变量赋值private String tagName;//解析到文档开头,执行该方法@Overridepublic void startDocument() throws SAXException {System.out.println("解析到文档开头");list = new ArrayList<Person>();}//解析到开始标签时,执行该方法,与标签相关的,标签有多个时,被调用多次// qName参数被用来接收标签名字,如果标签内带属性,Attributes 保存有标签内的属性@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {//解析到person标签System.out.println("解析到开始标签......"+qName); tagName = qName;if("person".equals(qName)){person = new Person();//获取属性,属性可能是多个,属性名和属性值是一对的,每次循环获取一对for (int i = 0; i < attributes.getLength(); i++) {//得到属性名String attrName = attributes.getQName(i);String attrValue = attributes.getValue(i);if ("id".equals(attrName)) {person.setId(attrValue);}//...}}}///解析到标签内容时,执行该方法,解析到的标签内容传给了参数ch@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {String data = new String(ch,start,length);System.out.println("解析到标签内容"+data);if ("name".equals(tagName))person.setName(data);else if("age".equals(tagName))person.setAge(Integer.parseInt(data));else if("sex".equals(tagName))person.setSex(data);}//解析到结束标签时,执行该方法,qName接收标签名字@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {System.out.print("解析到结束标签");//结束标签后面的空格被看成标签内容,也就是 跟标签内的数据是同等看待的,//所以也会调用 charactersSystem.out.println(qName);tagName = null;if ("person".equals(qName)) {list.add(person);}}//解析到文档结束时,执行该方法@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("解析到文档结束");super.endDocument();}public void setList(List<Person> list) {this.list = list;}public List<Person> getList() {return list;}}

解析过程

package com.zxw.sax1;import java.io.*;import java.util.List;import javax.xml.parsers.*;import org.xml.sax.SAXException;//流程:根据需要解析的xml  文件,面向对象,创建这个Person类, 然后定义Handler类,定义处理解析的过程,//最后。。。public class Client {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {// 创建SAX解析工厂对象SAXParserFactory factory = SAXParserFactory.newInstance();// 创建Sax解析器对象---具备解析功能的对象SAXParser parser = factory.newSAXParser();// 创建被解析的文件 的读取流, 解析一个文件,当然要先读取这个文件了// user.xml放置于当前工程下了FileInputStream fis = new FileInputStream("user.xml");// 创建Handler对象MyHandler handler = new MyHandler();// 调用parse方法,将读取流和handler关联起来了,// 内部在读取时调用到handler中定义的方法parser.parse(fis, handler);//获取集合List<Person> list = handler.getList();for (Person person : list) {System.out.println(person);}}}


0 0
原创粉丝点击