SAX解析XML文件

来源:互联网 发布:unity3d圣典app 编辑:程序博客网 时间:2024/05/22 02:12

XML是可扩展标记语言,可以使用SAX或者PULL解析。今天所写的是使用SAX解析XML文件。 SAX是Simple API for XML的缩写,几乎所有的XML解析器都会支持它。

使用SAX解析的步骤:

1, 创建SAX 解析器的工厂

 2, 通过解析器工厂 创建 SAX解析器
 3, 自定义解析的处理器  MyHandler 继承 DefaultHandler类
 4, 解析xml文档
 5, 需要通过handler对象调用方法 , 获取解析的结果。

解析实例:

xml文件:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <students>  
  3.     <student >  
  4.         <id>1</id>  
  5.         <name>zhangsan</name>  
  6.         <age>20</age>  
  7.         <sex>male</sex>  
  8.     </student>  
  9.     <student >  
  10.         <id>2</id>  
  11.         <name>lisi</name>  
  12.         <age>21</age>  
  13.         <sex>female</sex>  
  14.     </student>  
  15. </students>  
对应的Student类:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class Student {  
  2.     private int id;  
  3.     private String name;  
  4.     private String sex;  
  5.     private int age;  
  6.   
  7.     public int getId() {  
  8.         return id;  
  9.     }  
  10.   
  11.     public void setId(int id) {  
  12.         this.id = id;  
  13.     }  
  14.   
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.   
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.   
  23.     public String getSex() {  
  24.         return sex;  
  25.     }  
  26.   
  27.     public void setSex(String sex) {  
  28.         this.sex = sex;  
  29.     }  
  30.   
  31.     public int getAge() {  
  32.         return age;  
  33.     }  
  34.   
  35.     public void setAge(int age) {  
  36.         this.age = age;  
  37.     }  
  38.   
  39.     @Override  
  40.     public String toString() {  
  41.         return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";  
  42.     }  
  43.   
  44. }  
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class MyHandler extends DefaultHandler {  
  2.   
  3.     // 最终的结果集合  
  4.     private ArrayList<Student> list;  
  5.     private String tag;// 记录当前解析的标签 譬如id name1····  
  6.   
  7.     // 当前正在组装(填入属性值)的对象  
  8.     private Student student;  
  9.   
  10.     public ArrayList<Student> getList() {  
  11.         return list;  
  12.     };  
  13.   
  14.     @Override  
  15.     public void startDocument() throws SAXException {  
  16.         // 任务:初始化结果集合  
  17.         list = new ArrayList<>();  
  18.   
  19.     }  
  20.   
  21.     @Override  
  22.     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  
  23.         // 解析到元素开始的方法,系统自动调用该方法  
  24.         // qName: 标签名称 attributes:标签的属性(属性名称+属性值)其他参数很少使用  
  25.         // 任务1:记录当前解析的标签是什么? 方便在以后的方法中使用(characters)  
  26.         // 任务2:如果是对象的根元素 需要创建对象  
  27.         tag = qName;// 任务一  
  28.   
  29.         // 任务二  
  30.         if ("student".equals(qName)) {  
  31.             student = new Student();// student对象在endelement方法中使用  
  32.         }  
  33.     }  
  34.   
  35.     @Override  
  36.     public void characters(char[] ch, int start, int length) throws SAXException {  
  37.         // 解析到文本节点的方法,系统自动调用该方法  
  38.         // ch:装入文本的字符数组 start:有效数据的偏移量 length:有效数据的长度  
  39.         // 任务:判断当前正在解析的是哪个标签 如果是对象的属性标签id,name··需要将数据存入设置到Student对象中  
  40.         String content = new String(ch, start, length).trim();  
  41.   
  42.         if ("id".equals(tag)) {  
  43.             student.setId(Integer.parseInt(content));// 获取到id  
  44.   
  45.         } else if ("name".equals(tag)) {  
  46.             student.setName(content);  
  47.         } else if (("age").equals(tag)) {  
  48.             student.setAge(Integer.parseInt(content));  
  49.         } else if ("sex".equals(tag)) {// 最后一个不能写else 写elseif  
  50.             student.setSex(content);  
  51.         }  
  52.   
  53.     }  
  54.   
  55.     @Override  
  56.     public void endElement(String uri, String localName, String qName) throws SAXException {  
  57.         // 解析到元素的结束 系统会自动调用  
  58.         // qName:正在解析的标签名称  
  59.         // 任务一 把记录当前的解析的标签tag清空  
  60.         // 任务二 正在解析的标如果是Student,说明当前解析的对象已经组装完成,可以将其存入到集合中  
  61.   
  62.         // 任务一  
  63.         tag = "";  
  64.   
  65.         // 任务二  
  66.         if ("student".equals(qName)) {  
  67.             list.add(student);  
  68.         }  
  69.   
  70.     }  
  71.   
  72.     @Override  
  73.     public void endDocument() throws SAXException {  
  74.         // TODO Auto-generated method stub  
  75.         super.endDocument();  
  76.     }  
  77. }  
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class Test1 {  
  2.     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {  
  3.   
  4.         SAXParserFactory factory = SAXParserFactory.newInstance();  
  5.   
  6.         SAXParser parser = factory.newSAXParser();  
  7.   
  8.         MyHandler mh = new MyHandler();  
  9.   
  10.         parser.parse("XML文件路径", mh);  
  11.           
  12.         ArrayList<Student> list = mh.getList();  
  13.         for (Student student : list) {  
  14.             System.out.println(student);  
  15.         }  
  16.   
  17.     }  
  18. }  

但是如果遇见XML文件是:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <students>  
  3.     <student id="1">  
  4.         <name>zhangsan</name>  
  5.         <age>20</age>  
  6.         <sex>male</sex>  
  7.     </student>  
  8.     <student id="2">  
  9.         <name>lisi</name>  
  10.         <age>21</age>  
  11.         <sex>female</sex>  
  12.     </student>  
  13. </students>  

需要将MyHandler类修改为:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class MyHandler extends DefaultHandler {  
  2.       
  3.     //结果集合  
  4.     private ArrayList<Student> list;  
  5.     public ArrayList<Student> getList()  
  6.     {  
  7.         return list;  
  8.     }  
  9.     //当前解析的标签  
  10.     private String tag;  
  11.     //正在组装的对象  
  12.     private Student student;  
  13.       
  14.     @Override  
  15.     public void startDocument() throws SAXException {  
  16.         // TODO 集合的初始化  
  17.         list = new ArrayList<>();  
  18.     }  
  19.   
  20.     @Override  
  21.     public void startElement(String uri, String localName, String qName,  
  22.             Attributes attributes) throws SAXException {  
  23.         //1, 将当前解析的标签名称(qName) 赋值给tag  
  24.         tag = qName;  
  25.           
  26.         //2, 创建Student对象  
  27.         if("student".equals(qName))  
  28.         {  
  29.             student = new Student();  
  30.               
  31.             if(null !=attributes)  
  32.             {  
  33.                 //<student id="1" amount="100">  
  34.                 int count = attributes.getLength();//得到当前标签中有多少个属性  
  35.                 for(int i=0;i<count;i++)  
  36.                 {  
  37.                     //得到属性的名称  
  38.                     String name = attributes.getQName(i);  
  39.                     //得到属性的内容  
  40.                     String value = attributes.getValue(i);  
  41.                       
  42.                     if("id".equals(name))  
  43.                     {  
  44.                         student.setId(Integer.parseInt(value));  
  45.                     }  
  46.                 }  
  47.                   
  48.             }  
  49.         }  
  50.           
  51.           
  52.     }  
  53.   
  54.     @Override  
  55.     public void characters(char[] ch, int start, int length) throws SAXException {  
  56.         // TODO Auto-generated method stub  
  57.           
  58.         String content = new String(ch,start,length).trim();  
  59.           
  60.         if("name".equals(tag))  
  61.         {  
  62.             student.setName(content);  
  63.         }else if("age".equals(tag))  
  64.         {  
  65.             student.setAge(content);  
  66.         }else if("sex".equals(tag))  
  67.         {  
  68.             student.setSex(content);  
  69.         }  
  70.     }  
  71.   
  72.       
  73.     @Override  
  74.     public void endElement(String uri, String loaclName, String qName)  
  75.             throws SAXException {  
  76.         //清空tag  
  77.         tag = "";  
  78.         //将student放入list中  
  79.         if("student".equals(qName))  
  80.         {  
  81.             list.add(student);  
  82.         }  
  83.           
  84.     }  
  85.   
  86.       
  87.     @Override  
  88.     public void endDocument() throws SAXException {  
  89.         // TODO Auto-generated method stub  
  90.         super.endDocument();  
  91.     }  
  92. }  
0 0