解析XML文件,SAX解析案例

XML解析的四种方法

DOM解析:

  • 把文档中的所有元素出现的层次关系,在内存中构造出树形结构。
  • 优点是可以遍历和修改节点的内容。
  • 缺点是内存压力大,解析较慢。

SAX解析:

  • 是一种XML解析的替代方法。
  • 相比DOM方式,SAX是一种速度更快,更有效的方法。
  • 缺点:不能修改节点内容。

JDOM解析:

  • 仅适用具体的类,而不适用接口,不灵活。

DOM4J解析:

  • 是JDOM的一种智能分支,合并了许多超出基本XML文档的功能。

SAX解析

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

    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;
    }

    @Override
    public String toString() {
        return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}
import com.entity.Person;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

public class PersonHandler extends DefaultHandler {
    private List<Person> persons;
    private Person person;
    private String tag;//存储操作标签     

    // @Override     
    public void startDocument() throws SAXException {
        System.out.println("-----------解析开始-----------");
        persons = new ArrayList<Person>();
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("-----------解析结束----------");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("正在解析:<" + qName + ">");
        if (null != qName) {
            tag = qName;//存储标签名        
        }
        if (tag.equals("person")) {
            person = new Person();
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (null != qName) {
            if (qName.equals("person")) {
                persons.add(person);
            }
        }
        tag = null;
        System.out.println("正在解析</" + qName + ">");
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String contents = new String(ch, start, length).trim();
        if (null != tag) {
            if (tag.equals("name")) {
                person.setName(contents);
            } else if (tag.equals("age")) {
                if (tag.length() > 0) {
                    person.setAge(Integer.valueOf(contents));
                }
            }
        }
    }

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

    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }
}
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class XMLTest1 {
    public static void main(String[] args) throws Exception {
        // 获取解析工厂         
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //从工厂获取解析器         
        SAXParser parser = factory.newSAXParser();
        //加载文档document注册处理器         
        // 编写处理器         
        PersonHandler personHandler = new PersonHandler();
        //解析;注意这里加载XML文件的路径他是从线程里面加载的        

        parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml"), personHandler);
        //打印数据         
        System.out.println(personHandler.getPersons().toString());
    }
}
<?xml version="1.0" encoding="UTF-8" ?> 
<persons>     
      <person>        
             <name>小明</name>        
             <age>16</age>     
      </person>    
      <person>        
             <name>小红</name>        
             <age>5</age>     
      </person> 
</persons>
posted @ 2021-01-04 12:08  亚州Asu  阅读(115)  评论(0编辑  收藏  举报