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; } } } }
运行结果: