XML是可扩展标记语言,可以使用SAX或者PULL解析。今天所写的是使用SAX解析XML文件。 SAX是Simple API for XML的缩写,几乎所有的XML解析器都会支持它。
使用SAX解析的步骤:
1, 创建SAX 解析器的工厂
2, 通过解析器工厂 创建 SAX解析器
3, 自定义解析的处理器 MyHandler 继承 DefaultHandler类
4, 解析xml文档
5, 需要通过handler对象调用方法 , 获取解析的结果。
解析实例:
xml文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <students>
- <student >
- <id>1</id>
- <name>zhangsan</name>
- <age>20</age>
- <sex>male</sex>
- </student>
- <student >
- <id>2</id>
- <name>lisi</name>
- <age>21</age>
- <sex>female</sex>
- </student>
- </students>
- public class Student {
- private int id;
- private String name;
- private String sex;
- private int age;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
- }
- }
- public class MyHandler extends DefaultHandler {
- // 最终的结果集合
- private ArrayList<Student> list;
- private String tag;// 记录当前解析的标签 譬如id name1····
- // 当前正在组装(填入属性值)的对象
- private Student student;
- public ArrayList<Student> getList() {
- return list;
- };
- @Override
- public void startDocument() throws SAXException {
- // 任务:初始化结果集合
- list = new ArrayList<>();
- }
- @Override
- public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
- // 解析到元素开始的方法,系统自动调用该方法
- // qName: 标签名称 attributes:标签的属性(属性名称+属性值)其他参数很少使用
- // 任务1:记录当前解析的标签是什么? 方便在以后的方法中使用(characters)
- // 任务2:如果是对象的根元素 需要创建对象
- tag = qName;// 任务一
- // 任务二
- if ("student".equals(qName)) {
- student = new Student();// student对象在endelement方法中使用
- }
- }
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- // 解析到文本节点的方法,系统自动调用该方法
- // ch:装入文本的字符数组 start:有效数据的偏移量 length:有效数据的长度
- // 任务:判断当前正在解析的是哪个标签 如果是对象的属性标签id,name··需要将数据存入设置到Student对象中
- String content = new String(ch, start, length).trim();
- if ("id".equals(tag)) {
- student.setId(Integer.parseInt(content));// 获取到id
- } else if ("name".equals(tag)) {
- student.setName(content);
- } else if (("age").equals(tag)) {
- student.setAge(Integer.parseInt(content));
- } else if ("sex".equals(tag)) {// 最后一个不能写else 写elseif
- student.setSex(content);
- }
- }
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
- // 解析到元素的结束 系统会自动调用
- // qName:正在解析的标签名称
- // 任务一 把记录当前的解析的标签tag清空
- // 任务二 正在解析的标如果是Student,说明当前解析的对象已经组装完成,可以将其存入到集合中
- // 任务一
- tag = "";
- // 任务二
- if ("student".equals(qName)) {
- list.add(student);
- }
- }
- @Override
- public void endDocument() throws SAXException {
- // TODO Auto-generated method stub
- super.endDocument();
- }
- }
- public class Test1 {
- public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
- SAXParserFactory factory = SAXParserFactory.newInstance();
- SAXParser parser = factory.newSAXParser();
- MyHandler mh = new MyHandler();
- parser.parse("XML文件路径", mh);
- ArrayList<Student> list = mh.getList();
- for (Student student : list) {
- System.out.println(student);
- }
- }
- }
但是如果遇见XML文件是:
- <?xml version="1.0" encoding="UTF-8"?>
- <students>
- <student id="1">
- <name>zhangsan</name>
- <age>20</age>
- <sex>male</sex>
- </student>
- <student id="2">
- <name>lisi</name>
- <age>21</age>
- <sex>female</sex>
- </student>
- </students>
需要将MyHandler类修改为:
- public class MyHandler extends DefaultHandler {
- //结果集合
- private ArrayList<Student> list;
- public ArrayList<Student> getList()
- {
- return list;
- }
- //当前解析的标签
- private String tag;
- //正在组装的对象
- private Student student;
- @Override
- public void startDocument() throws SAXException {
- // TODO 集合的初始化
- list = new ArrayList<>();
- }
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException {
- //1, 将当前解析的标签名称(qName) 赋值给tag
- tag = qName;
- //2, 创建Student对象
- if("student".equals(qName))
- {
- student = new Student();
- if(null !=attributes)
- {
- //<student id="1" amount="100">
- int count = attributes.getLength();//得到当前标签中有多少个属性
- for(int i=0;i<count;i++)
- {
- //得到属性的名称
- String name = attributes.getQName(i);
- //得到属性的内容
- String value = attributes.getValue(i);
- if("id".equals(name))
- {
- student.setId(Integer.parseInt(value));
- }
- }
- }
- }
- }
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- // TODO Auto-generated method stub
- String content = new String(ch,start,length).trim();
- if("name".equals(tag))
- {
- student.setName(content);
- }else if("age".equals(tag))
- {
- student.setAge(content);
- }else if("sex".equals(tag))
- {
- student.setSex(content);
- }
- }
- @Override
- public void endElement(String uri, String loaclName, String qName)
- throws SAXException {
- //清空tag
- tag = "";
- //将student放入list中
- if("student".equals(qName))
- {
- list.add(student);
- }
- }
- @Override
- public void endDocument() throws SAXException {
- // TODO Auto-generated method stub
- super.endDocument();
- }
- }