MyException - 我的异常网
当前位置:我的异常网» XML/SOAP » Android SAX解析xml资料

Android SAX解析xml资料

www.MyException.Cn  网友分享于:2013-08-10  浏览:35次
Android SAX解析xml文件
andorid读取xml文件内容方法有三种 sax dom pull,其中 pull是android自带的
1.先认识一下xml文件中的些术语
<?xml version="1.0" encoding="UTF-8"?>   
<persons>   
    <person id="23">   
        <name>李明</name>   
        <age>23</age>   
    </person>   
    <person id="22">   
        <name>李量</name>   
        <age>25</age>   
    </person>   
</persons>  


xml中的标签和内容都可以叫做节点,其中的persons  person  name age 这些都叫做元素(element).而像李明 25 这些值叫做文本节点.那么有个问题 中<persons>到<person>之间的是什么,什么都没有? 答案是他也是节点,是文本节点,你会说他里面什么都没有啊,错了,它有回车和空格.这个在sax解析xml中你debug一下就会发现.回车和空格(或者是tab)是会被读取出来的.id是属性.
2.sax
sax是采用事件驱动,就是说他不需要完全读完xml文件,他是读到一个节点就解析一个节点是否符合xml语法,如果符合就调用相对应的方法其实就是回调方法,并且没有记忆功能.下面提到的这些方法都是在ContentHander()接口中的方法.
    startDocumnet() :当开始解析xml文件的声明的时候就会触发这个事件, 可以做一些初始化的工作
    startElement()   当开始解析元素的开始标签的时候,就会触发这个事件
    characters()     当读到文本元素的时候要触发这个事件.
    endElement()     当读到结束标签的时候 就会触发这个事件

    sax就是这样按照顺序来解析的.
3.sax读取xml文件举例
3-1创建一个项目 ReadXml
3-2将xml文件拷贝到根目录下.
<?xml version="1.0" encoding="UTF-8"?>   
<persons>   
    <person id="23">   
        <name>李明</name>   
        <age>23</age>   
    </person>   
    <person id="22">   
        <name>李量</name>   
        <age>25</age>   
    </person>   
</persons> 

可以看出这个xml文件中有一个可以抽象出来的对象 就是person 属性有id name age
那么我们就建立一个bean
3-3:创建bean
package com.leequer.service.demo;   
/**  
 * <person id="23">  
        <name>李明</name>  
        <age>23</age>  
    </person>  
    <person id="22">  
        <name>李量</name>  
        <age>25</age>  
    </person>  
 * @author leequer  
 *   
 * xml文件对应的bean  
 */  
public class Person {   
       
    private Integer id;   
    private String name;   
    private int age;   
       
    public Person ()   
    {}   
    public Person (String name ,int age)   
    {   
        this.name = name;   
        this.age = age;   
    }   
    public Integer getId() {   
        return id;   
    }   
    public void setId(Integer id) {   
        this.id = id;   
    }   
    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;   
    }   
    @Override  
    public String toString() {   
        // TODO Auto-generated method stub   
        return this.id+",name  "+this.name+"  age  "+this.age+"\n";   
    }   
       
}  



3-4:遵循mvc的架构,我们建立一个service用来读取xml
package com.leequer.service;   
  
import java.io.InputStream;   
import java.util.List;   
  
  
import javax.xml.parsers.SAXParser;   
import javax.xml.parsers.SAXParserFactory;   
  
import org.xml.sax.XMLReader;   
  
  
  
import com.leequer.service.demo.Person;   
  
public class SaxReadxml {   
    public static  List<Person> readXml(InputStream inStream)throws Exception {   
        SAXParserFactory spf = SAXParserFactory.newInstance(); // 初始化sax解析器   
        SAXParser sp = spf.newSAXParser(); // 创建sax解析器   
        //XMLReader xr = sp.getXMLReader();// 创建xml解析器   
        XMLContentHandler handler = new XMLContentHandler();   
        sp.parse(inStream, handler);   
        return handler.getPersons();   
    }   
}  



sp.parse(inStream, handler); 
这句可以看出xml文件是以流的形式传进来的,参数handler就是回调函数的实例,当sax解析器解析xml文件的时候当遇到符合xml的内容就会去handle类中调用对应的上面提到的方法.那我们建立这个XMLContentHandler 就要求这个类要实现ContentHandler()这个接口,但是这个接口中有很多需要实现的方法.sax提供了一个DefaultHandler接口 只要实现这个接口中你感兴趣的方法就可以了.

3-5:创建XMLContentHandler 并完成读取时的事件的实现 注意看注释
package com.leequer.service;   
  
import java.util.ArrayList;   
import java.util.List;   
  
import org.xml.sax.Attributes;   
import org.xml.sax.SAXException;   
import org.xml.sax.helpers.DefaultHandler;   
  
import com.leequer.service.demo.Person;   
  
public class XMLContentHandler extends DefaultHandler {   
    private List<Person> persons;   
       
    private Person person;   
    private String tempString;   
    private static final String NAMESTRING = "name";   
    private static final String AGESTRING = "age";   
    private static final String PERSONSTRING = "person";   
    private static final String IDSTRING = "id";   
  
    public List<Person> getPersons() {   
        return persons;   
    }   
       
    /**  
     * sax 解析文件不带记忆,只读取 对xml文件中的 <person id="23"> <name>李明</name> <age>23</age>  
     * </person> <person id="22"> <name>李量</name> <age>25</age> </person> 这部分感兴趣  
     * 那么这部分包含了person这个节点元素的开始和结尾,那么就要有startElement和endElement  
     * 这两个方法;还有text的节点元素,(就是像节点之间的回车和空格还有标签中的像李明这样的文字都是文本节点 元素  
     * (text节点元素)那么要解析文本节点元素就要用到characters 这个方法来获取信息。)  
     */  
/**  
 * 要开始读取xml文件的时候调用的方法  
 * 初始化persons  
 */  
    @Override  
    public void startDocument() throws SAXException {   
        //这里做list的初始化工作   
        persons = new ArrayList<Person>();   
    }   
  
/**  
 * sax 读取到文本节点的时候调用了这个方法  
 */  
    @Override  
    public void characters(char[] ch, int start, int length)   
            throws SAXException {   
           
        if (person != null) {   
            String valueString = new String(ch, start, length);   
            if (NAMESTRING.equals(tempString)) {   
                // 如果当前解析到的节点是name 就要将name中的文本节点元素的值得到   
                person.setName(valueString);   
            } else if (AGESTRING.equals(tempString)) {   
                person.setAge(new Integer(valueString).intValue());   
            }   
        }   
    }   
/**  
 * sax 读取到元素节点的时候用到这个方法;  
 */  
    @Override  
    public void startElement(String uri, String localName, String name,   
            Attributes attributes) throws SAXException {   
        // 先判断读到的元素是否是person   
        if (PERSONSTRING.equals(localName)) {   
            // 如果读到的是person这个元素 就要保存起来,保存在我们创建的那个person的类中 所以我们要new一个person类   
            person = new Person();   
            // attributes是属性。   
            person.setId(new Integer(attributes.getValue(IDSTRING)));   
        }    
        tempString = localName;   
  
    }   
/**  
 * 这个方法是每次遇到结束的标签都会执行的 并不是只遇到最后的结尾才调用  
 *   
 * 读取完毕遇到person'的结尾 就将封装好的一个personbean保存到list中 并且清空person对象  
 *   
 */  
       
    @Override  
    public void endElement(String uri, String localName, String name)   
            throws SAXException {   
        if(PERSONSTRING.equals(localName)&&person!=null)   
        {   
            persons.add(person);   
            person = null;   
        }   
        tempString = null;   
           
    }   
       
       
       
  
}  



3-6:写个测试类来实验 将xml文件装载入 然后读取
package com.leequer.readxml;   
/**  
 * 测试类  
 */  
import java.io.InputStream;   
import java.util.Iterator;   
import java.util.List;   
  
import com.leequer.service.SaxReadxml;   
import com.leequer.service.demo.Person;   
  
import android.test.AndroidTestCase;   
import android.util.Log;   
  
public class SaxReadxmlTest extends AndroidTestCase {   
    private String PERSONSTRING = "ObjectPerson";   
    public void testReadXml() throws Exception   
    {//类装载器   
        InputStream inputStream = SaxReadxmlTest.class.getClassLoader().getResourceAsStream("NewFile.xml");   
           
        List <Person> personsList = SaxReadxml.readXml(inputStream);   
           
        for (Iterator iterator = personsList.iterator(); iterator.hasNext();) {   
            Person person = (Person) iterator.next();   
            Log.i(PERSONSTRING, person.toString());   
        }   
           
    }   
}  


本文是从他处转载而来,原文链接
http://leequer.iteye.com/blog/653148

文章评论

程序员的鄙视链
程序员的鄙视链
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
一个程序员的时间管理
一个程序员的时间管理
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员和编码员之间的区别
程序员和编码员之间的区别
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我的丈夫是个程序员
我的丈夫是个程序员
那些争议最大的编程观点
那些争议最大的编程观点
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
老程序员的下场
老程序员的下场
编程语言是女人
编程语言是女人
漫画:程序员的工作
漫画:程序员的工作
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
旅行,写作,编程
旅行,写作,编程
为什么程序员都是夜猫子
为什么程序员都是夜猫子
Java程序员必看电影
Java程序员必看电影
我是如何打败拖延症的
我是如何打败拖延症的
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
鲜为人知的编程真相
鲜为人知的编程真相
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员必看的十大电影
程序员必看的十大电影
程序员应该关注的一些事儿
程序员应该关注的一些事儿
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
总结2014中国互联网十大段子
总结2014中国互联网十大段子
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
 程序员的样子
程序员的样子
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
代码女神横空出世
代码女神横空出世
10个调试和排错的小建议
10个调试和排错的小建议
程序员都该阅读的书
程序员都该阅读的书
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
如何成为一名黑客
如何成为一名黑客
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有