SAX

一、一个RSS文件就是一段规范的XML数据,该文件一般以RSS、XML或者RDF作为后缀。

二、SAX(Simple API for XML)

  优点:不用事先调入整个文档,占用资源少

  缺点:不像DOM一样将文档树长期驻留在内存,数据是不持久的

  使用场合:机器有性能限制,尤其是在嵌入式环境如Android,极力推荐采用SAX进行解析。

三、具体实现的步骤如下:

  1、新建一个工厂类:

    SAXParserFactory=SAXParserFactory.newInstane();

  2、让工厂类产出一个SAX的解析类

    SAXParser parser=factory.newSAXParser();

  3、从解析类中得到一个XMLReader的实例

    XMLReader xmlreader=parser.getXMLReader();

  4、把自己编写的Hander注册到XMLReader中去,一般最重要的就是ContentHandler。

    MyRSSHandler handler=new  MyRSSHandler();

    xmlreader.setContentHandler(handler);

    public class MyRSSHandler extends DefaultHandler{

    }

四、实例

1、我新建了一个student.xml,并将它放在/data/data/lyz.rss目录下

<?xml version="1.0" encoding="utf-8"?>
<root>
<student id="1" group="1">
<name>张三</name>
<sex>男</sex>
<age>18</age>
</student>
<student id="2" group="2">
<name>李四</name>
<sex>女</sex>
<age>18</age>
</student>
<student id="3" group="3">
<name>小王</name>
<sex>男</sex>
<age>18</age>
</student>
<student id="4" group="4">
<name>小张</name>
<sex>男</sex>
<age>18</age>
</student>
<student id="5" group="5">
<name>小明</name>
<sex>男</sex>
<age>18</age>
</student>
</root>

2、

public class Student {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
private String name;
private String sex;
private int age;
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;
}
}

3、

public class MyHandle extends DefaultHandler{

private List<Student> list;//存放遍历集合

private Student student; //构建Student对象

private String tagName; //用来存放每次遍历后的元素名称(节点名称)

public List<Student> getList() {
return list;
}
public void setList(List<Student> list) {
this.list = list;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}

//只调用一次 初始化list集合
@Override
public void startDocument() throws SAXException {
list=new ArrayList<Student>();
}


//调用多次 开始解析
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals("student")){
student=new Student();
//获取student节点上的id属性值
student.setId(Integer.parseInt(attributes.getValue(0)));
}
this.tagName=qName;
}


//调用多次
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals("student")){
this.list.add(this.student);
}
this.tagName=null;
}


//只调用一次
@Override
public void endDocument() throws SAXException {
}

//调用多次
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(this.tagName!=null){
String date=new String(ch,start,length);
if(this.tagName.equals("name")){
this.student.setName(date);
}
else if(this.tagName.equals("sex")){
this.student.setSex(date);
}
else if(this.tagName.equals("age")){
this.student.setAge(Integer.parseInt(date));
}
}
}
}

 

4、

public class MainActivity extends Activity {
private Button bt;
private TextView show;
String str = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt=(Button) findViewById(R.id.bt);
show=(TextView)findViewById(R.id.tvshow);
bt.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
mysax();
}
});
}

public void mysax(){
try {
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
XMLReader reader=parser.getXMLReader();
MyHandle myhandler=new MyHandle();
reader.setContentHandler(myhandler);
//InputStream stream=this.getClassLoader().getResourceAsStream("/student.xml");
//调用parse()方法
//parser.parse(stream, handler);
File file=new File("/data/data/lyz.rss/student.xml");
parser.parse(file, myhandler);

//遍历结果
List<Student> list=myhandler.getList();
for(Student student:list){
str +=("id:"+student.getId()+"\tname:"+student.getName()+"\tsex:"+student.getSex()+"\tage:"+student.getAge())+"\n";
}
show.setText(str);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

 

 /*

URL url=new URL("http://www.baidu.com");
InputStream stream=url.openStream();
InputSource is=new InputSource(stream);
reader.parse(is);

 */

 

posted @ 2012-06-08 16:06  罗小姿  阅读(491)  评论(0编辑  收藏  举报