zoukankan      html  css  js  c++  java
  • 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);

     */

  • 相关阅读:
    用代码操作文件(文件夹)
    文件上传
    用ajax、PHP、session做购物车
    ajax返回数据类型为JSON数据的处理
    Hadoop机架感知
    Linux 克隆虚拟机以及克隆之后引起的“Device eth0 does not seem to be present, delaying initialization”问题解决
    克隆之后一键修改IP、删除Mac地址、修改主机名(未测试成功只是思路)
    关于Hadoop的杂乱无章(续更)
    使用CentOS6.8搭建Hadoop集群
    CentOS6.8卸载与安装yum
  • 原文地址:https://www.cnblogs.com/lyz459/p/2541772.html
Copyright © 2011-2022 走看看