`

sax XML

阅读更多

 

andorid读取xml文件内容方法有三种 sax dom pull,其中 pull是android自带的
1.先认识一下xml文件中的些术语
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代码 
<?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
Java代码 
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
Java代码 
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 并完成读取时的事件的实现 注意看注释
Java代码 
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());  
        }  
          
    }  
}

分享到:
评论

相关推荐

    android sax xml解析demo

    本篇文章将详细探讨Android中的SAX(Simple API for XML)解析方式,并提供一个简单的SAX XML解析Demo。 SAX解析是基于事件驱动的解析模型,它不会一次性加载整个XML文档到内存,而是逐行读取,当遇到特定的XML元素...

    SAX_XML.rar_XML SAX_sax xml_xml

    SAX(Simple API for XML)是XML解析器的一种,它以事件驱动的方式解析XML文档,而非DOM(Document Object Model)解析器那样将整个XML文档加载到内存中。SAX解析器在处理大型XML文件时更高效,因为它只在需要时读取...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    Java作为一种强大的编程语言,提供了多种解析XML文档的方法,其中包括DOM(Document Object Model)和SAX(Simple API for XML)。本压缩包文件“XML-java.rar”包含了关于使用Java解析XML的实例,特别强调了SAX解析...

    xml_DOM_SAX.rar_DOM_dom xml saxxml_java dom_sax

    在Java中,处理XML文件主要有两种解析器:DOM(Document Object Model)和SAX(Simple API for XML)。这两种解析方式各有特点,适用于不同的场景。 1. DOM解析: DOM解析器将整个XML文档加载到内存中,构建一个树...

    test_sax.rar_XML SAX vs20_sax_sax xml_读取XML文档

    在处理大型XML文件时,为了提高效率,通常会采用两种解析器:DOM(Document Object Model)和SAX(Simple API for XML)。本文将重点讨论SAX解析器,并通过描述中的"test_sax.rar"压缩包中的示例,讲解如何使用SAX...

    xml.rar_android_android sax_android sax xml_java xml_sax

    本资料包“xml.rar”主要关注Android环境下的XML解析,特别是SAX解析器,同时也涵盖了DOM和Pull解析方式。 1. XML基本概念: XML是一种自描述性的标记语言,它通过标签来定义数据结构。每个XML文档都包含元素、...

    java dom sax XML入门教程

    Java作为一款强大的编程语言,提供了多种处理XML的API,其中包括DOM(Document Object Model)和SAX(Simple API for XML)。本教程将帮助初学者深入理解这两种解析XML的方法。 1. DOM解析器 DOM解析器将整个XML...

    SAX解析超大XML文件 示例代码

    为了解决这个问题,我们可以采用流式解析的方式,比如SAX(Simple API for XML)。SAX解析器逐行读取XML文件,只在需要时处理数据,显著降低了内存需求。 SAX解析的核心在于事件驱动模型。当解析器读取XML文件时,...

    dom和sax对xml的解析

    在Java中,有多种方式可以解析XML文档,其中最常用的是DOM(Document Object Model)和SAX(Simple API for XML)。本篇文章将详细介绍DOM和SAX解析XML的方法,并通过提供的`DomDemo.java`和`SaxDemo.java`示例代码...

    SAX解析XML文件实例

    SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...

    SAX_XML_API

    This can handle the xml Api source file

    Dom,Sax,Xpath解析XML实例

    在处理XML时,我们通常会使用三种主要的解析方式:DOM(Document Object Model)、SAX(Simple API for XML)和XPath(XML Path Language)。下面将详细介绍这三种解析方法,并结合实例进行讲解。 1. DOM解析: DOM...

    Sax解析XML文件解析

    SAX(Simple API for XML)是XML解析的一种方法,它以事件驱动的方式处理XML文档,非常适合处理大体积的XML文件,因为它不需要一次性加载整个文件到内存,而是逐行读取,因此节省了资源。 **SAX解析XML的基本原理:...

    VC_WND_SAX.rar_sax_sax vc_vc SAX _vc xml sax

    《VC++实现的SAX XML解析器:非连续性分析详解》 XML(eXtensible Markup Language)作为一种通用的数据交换格式,广泛应用于各种软件系统之间的数据交互。在处理大型XML文档时,为了提高效率和节省内存,通常采用...

    sax读取xml文件并反射到对应的实体中

    sax读取xml文件并反射到对应的实体中

    SAX方式解析xml

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、文档存储等领域。...在本示例的压缩包文件"SaxXml"中,可能包含了一个使用SAX解析XML的示例代码或教程,供学习者参考。

    sax解析xml本地读取xml

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...

    sax解析xml文件

    SAX(Simple API for XML)是一种轻量级的XML解析技术,主要用于读取XML文档。相较于DOM(Document Object Model)解析器,SAX解析器占用更少的内存和处理时间,因为它不会一次性加载整个XML文档到内存,而是采用...

    Java SAX解析Xml文档Demo

    Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...

    Sax解析xml文件

    在Android和Java编程中,处理XML文件是常见的任务,而SAX(Simple API for XML)是一种轻量级、事件驱动的XML解析器,它以流式方式读取XML文档,只在需要时解析内容,因此非常适合处理大体积的XML文件。 SAX解析器...

Global site tag (gtag.js) - Google Analytics