Java使用SAX解析xml文档

Java内部提供了解析器,可以很方便地解析xml文档。

步骤:

1.创建解析工厂  SAXParserFactory.newInstance()

2.从工厂中获取解析器  .newSAXParser()

3.自行编写处理器:继承DefaultHandler,重写相关方法。

4.创建自己的处理器对象

5.开始解析:使用解析器的parse(目标文件,处理器)方法

6.读取数据


 

例子

读取此xml文件内容。

<?xml version="1.0" encoding="UTF-8" ?>

<persons>
    <person>
        <name>二狗子</name>
        <age>18</age>
    </person>
    
    <person>
        <name>三娃子</name>
        <age>32</age>
    </person>
</persons>

创建了一个Persons类来存储数据。

public class Persons {
    private String name;
    private int age;

    public Persons() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

解析过程:

/**
 * Sax解析xml文件
 */
public class SaxXml {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, SAXException {
        //1.获取解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //2.从工厂中获取解析器
        SAXParser parser = factory.newSAXParser();
        //3.编写处理器
        //4.加载文档注册处理器
        PHandler  handler = new PHandler();
        //5.解析
        parser.parse(Thread.currentThread()
                .getContextClassLoader()
                .getResourceAsStream("lrj/xml/p.xml"),handler);
        //6.读取
        List<Persons> list = handler.getPersons();
        for(Persons temp :list){
            System.out.println(temp.getName()+":"+temp.getAge());
        }
    }
}

处理器:

//3.编写处理器
class PHandler extends DefaultHandler {
    private List<Persons> persons;
    private Persons person;
    private String element;//当前正在解析哪个元素

    public List<Persons> getPersons() {
        return persons;
    }

    //文档开始解析,初始化容器
    @Override
    public void startDocument() throws SAXException {
        persons = new ArrayList<>();
    }

    //解析元素内容
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String data = new String(ch,start,length).trim();
        if(null!=element) {//element为空的时候不解析内容(内容为空)
            if (element.equals("name")) {//解析到name的时候
                person.setName(data);
            } else if (element.equals("age")) {//解析到age的时候
                person.setAge(Integer.parseInt(data));
            }
        }
    }

    //解析元素开始
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        element = qName;
        if(element.equals("person")){//开始解析person时候创建一个对象
            person = new Persons();
        }
    }

    //解析元素结束
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        element = qName;
        if(null!=element){
            if(element.equals("person")){//person解析结束,对象加入容器中
                persons.add(person);
            }else if(element.equals("name")||element.equals("age")){//避免解析到空格
                element = null;
            }
        }
    }
}

运行结果:

 

posted @ 2022-11-19 11:44  在博客做笔记的路人甲  阅读(651)  评论(0编辑  收藏  举报