XML解析之SAX

来源:互联网 发布:bigworld引擎全套源码 编辑:程序博客网 时间:2024/05/22 17:24

今天我们来用SAX解析XML。
首先我们来写一个简单的XML文件,student.xml:

<?xml version="1.0" encoding="UTF-8"?><student id="3" xx="xx">    <name>张三</name>    <sex></sex>    <age>20</age></student>
public class SAX01 extends DefaultHandler {    @Override    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {        System.out.println("开始扫描元素:" + qName);        if (attributes != null) {            for (int i = 0; i < attributes.getLength(); i++) {                System.out.print(attributes.getQName(i) + "=" + attributes.getValue(i) + "\n");            }        }    }    @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 startDocument() throws SAXException {        System.out.println("扫描文档开始");    }    @Override    public void endDocument() throws SAXException {        System.out.println("扫描文档结束");    }    public static void main(String[] args) throws Exception {        SAXParserFactory factory = SAXParserFactory.newInstance();        SAXParser parser = factory.newSAXParser();        parser.parse("src/student.xml", new SAX01());    }}

得到输出结果:
扫描文档开始
开始扫描元素:student
id=3
xx=xx
扫描文本节点

开始扫描元素:name
扫描文本节点张三
结束扫描元素:name
扫描文本节点

开始扫描元素:sex
扫描文本节点男
结束扫描元素:sex
扫描文本节点

开始扫描元素:age
扫描文本节点20
结束扫描元素:age
扫描文本节点

结束扫描元素:student
扫描文档结束

然后我们来解析一个复杂一点的xml,students.xml:

<?xml version="1.0" encoding="UTF-8"?><students>    <student id="001">        <name>张三</name>        <sex></sex>        <age>20</age>    </student>    <student id="002">        <name>李四</name>        <sex></sex>        <age>21</age>    </student></students>

然后我们来创建一个学生类:

public class Student {    private String id;    private String name;    private String sex;    private int age;    @Override    public String toString() {        return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";    }    //get、set方法省略}

我们使用SAX来解析它。

public class SAX02 extends DefaultHandler {    private List<Student> students = null;    private Student student = null;    private String preTag = null;// 标记上一个节点名称    @Override    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {        if ("student".equals(qName)) {            student = new Student();            if (attributes != null) {                student.setId(attributes.getValue(0));            }        }        preTag = qName;    }    @Override    public void endElement(String uri, String localName, String qName) throws SAXException {        if ("student".equals(qName)) {            students.add(student);            student = null;        }        preTag = null;    }    @Override    public void characters(char[] ch, int start, int length) throws SAXException {        if (preTag != null) {            String content = new String(ch, start, length);            if ("name".equals(preTag)) {                student.setName(content);            } else if ("sex".equals(preTag)) {                student.setSex(content);            } else if ("age".equals(preTag)) {                student.setAge(Integer.parseInt(content));            }        }    }    @Override    public void startDocument() throws SAXException {        System.out.println("开始读取学生信息");        students = new ArrayList<>();    }    @Override    public void endDocument() throws SAXException {        System.out.println("学生信息读取完毕");    }    private void printList() {        for (Student s : students) {            System.out.println(s);        }    }    public static void main(String[] args) throws Exception {        SAXParserFactory factory = SAXParserFactory.newInstance();        SAXParser parser = factory.newSAXParser();        SAX02 sax02 = new SAX02();        parser.parse("src/students.xml", sax02);        sax02.printList();    }}

最后得到的结果为:
开始读取学生信息
学生信息读取完毕
Student [id=001, name=张三, sex=男, age=20]
Student [id=002, name=李四, sex=女, age=21]

0 0
原创粉丝点击