先定义一个person类由于接收解析的数据
public class person {
private String name;
private int age;
public person() {
}
public person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
给注册处理器增加容器用于存储解析的数据封装成的对象
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/*
* SAX流程
*/
public class XMLPerson {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//SAX解析
//1.获取解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.从解析工厂获取解析器
SAXParser parse = factory.newSAXParser();
//3.加载文档Document注册处理器
PersonHandler handler = new PersonHandler();
//4.编写处理器
parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("com/server/basic/p.xml"), handler);
//5.从注册处理器拿数据
List<person> persons = handler.getPersons();
for(person p:persons) {
System.out.println(p);
}
}
}
//给注册处理器增加存储解析到的内容的容器
class PersonHandler extends DefaultHandler{
//考虑到会存在多个person的情况下,用容器存储person
private List<person> persons;
private person person;
private String tag; //记录当前操作的标签名
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<person>();
}
public List<person> getPersons() {
return persons;
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String contents = new String(ch, start, length).trim(); //trim() 方法用于删除字符串的头尾空白符
if(null != tag) {
if(tag.equals("name") && contents.length() > 0)
person.setName(contents);
if(tag.equals("age") && contents.length() > 0)
person.setAge(Integer.valueOf(contents));
}
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// System.out.println(qName + "-->start");
if(null != qName) {
tag = qName;
if(qName.equals("person"))
person = new person();
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// System.out.println(qName + "-->end");
if(qName.equals("person"))
persons.add(person);
tag = null;
}
}
还是使用 上一篇博客 中的xml文件用于测试数据处理:得到容器存储有如下对象
![](https://i-blog.csdnimg.cn/blog_migrate/e68872ed703bb2522bb42fe5e0f74768.png)