Android--XML文件解析(SAX)

本文介绍如何使用Java解析XML数据,通过自定义解析类将XML数据转换为Person对象,展示了解析过程及测试验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
Java代码 复制代码  收藏代码
  1.   
  2. Xml数据原型为:   
  3.     <?xml version="1.0" encoding="UTF-8"?>   
  4.     <persons>   
  5.         <person id="23">   
  6.             <name>李明</name>   
  7.             <age>30</age>   
  8.         </person>   
  9.         <person id="20">   
  10.             <name>李向梅</name>   
  11.             <age>25</age>   
  12.         </person>   
  13.     </persons>   
  14. --------------------------------------------------》   
  15. 1. 编写XML解析类   
  16.     package cn.android.util;   
  17.   
  18.     import java.util.ArrayList;   
  19.     import java.util.List;   
  20.   
  21.     import org.xml.sax.Attributes;   
  22.     import org.xml.sax.SAXException;   
  23.     import org.xml.sax.helpers.DefaultHandler;   
  24.   
  25.     import cn.android.domain.Person;   
  26.   
  27.     /**  
  28.      * 继承DefaultHandler类  
  29.      * 用于解析XML文档的解析类  
  30.      * @author Administrator  
  31.      *  
  32.      * 2010-6-28 下午07:51:20  
  33.      */  
  34.     public class XmlParser extends DefaultHandler{   
  35.   
  36.         //此处将XML里的数据封装成Person类,personList用于装解析后的数据   
  37.         private List<Person> personList = new ArrayList<Person>();   
  38.         //定义一个Person引用   
  39.         private Person person = null;   
  40.         //定义一个标记变量,标记当前的Xml文件被解析到哪个标签   
  41.         private String currentTag = null;   
  42.            
  43.         /**  
  44.          * 返回解析后的数据,是一个对象数组  
  45.          * @return  
  46.          */  
  47.         public List<Person> getObjectListFromXML() {   
  48.             return personList;   
  49.         }   
  50.            
  51.            
  52.         /**  
  53.          * 解析XML时,当开始读到一个元素标签开始时,执行下面方法  
  54.          */  
  55.         @Override  
  56.         public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {   
  57.             //判断标签名是否为person,是的话创建一个Person对象,并将其id属性拿出来,赋值到person对象中   
  58.             if("person".equals(localName)) {   
  59.                 person = new Person();   
  60.                 Integer id = new Integer(attributes.getValue(0));   
  61.                 person.setId(id);   
  62.             }   
  63.             //标记当前标签名   
  64.             currentTag = localName;   
  65.         }   
  66.   
  67.         /**  
  68.          * 解析XML时,当开始读到一个文本元素时,执行下面方法  
  69.          */  
  70.         @Override  
  71.         public void characters(char[] ch, int start, int length) throws SAXException {   
  72.                
  73.             //判断此文本元素是在一个 有效的标签体里面的     例:正确:<name>文本元素</name>  错误: 文本元素<name></name>   
  74.                
  75.             if(currentTag != null) {   
  76.                 //如果此文本元素为有效,则得到它的内容   
  77.                 String value = new String(ch, start, length);   
  78.                    
  79.                 //如果是在name标签里,则赋值给person的name属性   
  80.                 if("name".endsWith(currentTag)) {   
  81.                     person.setName(value);   
  82.                 }   
  83.                    
  84.                 //如果是在age标签里,则赋值给person的age属性   
  85.                 if("age".endsWith(currentTag)) {   
  86.                     person.setAge(new Short(value));   
  87.                 }   
  88.             }   
  89.         }   
  90.   
  91.   
  92.         /**  
  93.          * 解析XML时,当读到结束一个元素标签时,执行下面方法  
  94.          */  
  95.         @Override  
  96.         public void endElement(String uri, String localName, String name) throws SAXException {   
  97.                
  98.             //将当前标签名制空   
  99.             currentTag = null;   
  100.                
  101.             //如果当前结束的标签名是person的话,代表一个person对象已经读取完毕。将其添加到list后制空   
  102.             if("person".endsWith(localName)) {   
  103.                 personList.add(person);   
  104.                 person = null;   
  105.             }   
  106.         }   
  107.                
  108.            
  109.     }   
  110.   
  111. ---------------------------------------------------------------------------------------------------------------------》   
  112. 2。测试类:   
  113.     package cn.android.xml;   
  114.   
  115.     import java.io.InputStream;   
  116.   
  117.     import javax.xml.parsers.SAXParser;   
  118.     import javax.xml.parsers.SAXParserFactory;   
  119.   
  120.     import android.test.AndroidTestCase;   
  121.     import android.util.Log;   
  122.     import cn.android.domain.Person;   
  123.     import cn.android.util.XmlParser;   
  124.   
  125.     public class TestSAX extends AndroidTestCase {   
  126.   
  127.         public void testParse() throws Throwable {   
  128.             try {   
  129.                 //得到SAX解析工厂   
  130.                 SAXParserFactory spf = SAXParserFactory.newInstance();   
  131.                    
  132.                 // 设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性   
  133.                 // saxParser.setProperty("http://xml.org/sax/features/namespaces",true);   
  134.                 SAXParser saxParser = spf.newSAXParser(); // 创建解析器   
  135.                    
  136.                    
  137.                 //得到SAX解析实现类   
  138.                 XmlParser handler = new XmlParser();   
  139.                 //将xml文件以输入流的形式读入到内存中。   
  140.                 InputStream inStream = XmlParseActivity.class.getClassLoader().getResourceAsStream("person.xml");   
  141.                    
  142.                 //开始解析   
  143.                 saxParser.parse(inStream, handler);   
  144.                    
  145.                 //关闭输入留   
  146.                 inStream.close();   
  147.                    
  148.                 //将得到的每个对象信息写入到日志中   
  149.                 for(Person person : handler.getObjectListFromXML()) {   
  150.                     Log.i("XmlParseActivity", person.toString());   
  151.                 }   
  152.             } catch (Exception e) {   
  153.                    
  154.                 e.printStackTrace();   
  155.             }   
  156.         }   
  157.   
  158.     }   
  159.   
  160.   
  161. 注:域对象Person类:   
  162.        
  163.     package cn.android.domain;   
  164.   
  165.     public class Person {   
  166.   
  167.     private Integer id;   
  168.     private String name;   
  169.     private Short age;   
  170.     public Integer getId() {   
  171.         return id;   
  172.     }   
  173.     public void setId(Integer id) {   
  174.         this.id = id;   
  175.     }   
  176.     public String getName() {   
  177.         return name;   
  178.     }   
  179.     public void setName(String name) {   
  180.         this.name = name;   
  181.     }   
  182.     public Short getAge() {   
  183.         return age;   
  184.     }   
  185.     public void setAge(Short age) {   
  186.         this.age = age;   
  187.     }   
  188.        
  189.     @Override  
  190.     public String toString() {   
  191.         return id + "---" + name + "---" + age;   
  192.     }   
  193. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值