zoukankan      html  css  js  c++  java
  • 安卓解析XML之SAX

    ***MySaxHandler***

    package android_xml_sax;
    
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class MySaxHandler extends DefaultHandler {
        public List<Book> list ;
        public Book book ;
        public StringBuilder builder;
        
        
        public List<Book> getList() {
            return list;
        }
        
        
        @Override
        public void startDocument() throws SAXException {
            // TODO 自动生成的方法存根
            super.startDocument();
            list = new ArrayList<Book>();
            builder = new StringBuilder();
        }
    
        /**
         *方法说明:
         *解析器在 XML 文档中的每个元素的开始调用此方法;对于每个 startElement 事件都将有相应的 endElement 事件(即使该元素为空时)。所有元素的内容都将在相应的 endElement 事件之前顺序地报告。
         *参数说明:
         *uri - 名称空间 URI,如果元素没有名称空间 URI,或者未执行名称空间处理,则为空字符串
         *localName - 本地名称(不带前缀),如果未执行名称空间处理,则为空字符串
         *qName - 限定名(带有前缀),如果限定名不可用,则为空字符串
         *atts - 连接到元素上的属性。如果没有属性,则它将是空 Attributes 对象。在 startElement 返回后,此对象的值是未定义的
         */
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            // TODO 自动生成的方法存根
            super.startElement(uri, localName, qName, attributes);
            if(qName.equals("book")){
                book = new Book();
            }
            builder.setLength(0);
        }
        
        /**
         * 接收字符数据的通知,可以通过new String(ch,start,length)构造器,创建解析出来的字符串文本.
         *参数:
         *ch - 来自 XML 文档的字符
         *start - 数组中的开始位置
         *length - 从数组中读取的字符的个数 
         */
    
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            // TODO 自动生成的方法存根
            super.characters(ch, start, length);
            builder.append(ch, start, length);  //将读取的字符数组追加到builder中     
            
        }
        /**
         * SAX 解析器会在 XML 文档中每个元素的末尾调用此方法;对于每个 endElement 事件都将有相应的 startElement 事件(即使该元素为空时)。
         * 参数:
         *uri - 名称空间 URI,如果元素没有名称空间 URI,或者未执行名称空间处理,则为空字符串
         *localName - 本地名称(不带前缀),如果未执行名称空间处理,则为空字符串
         *qName - 限定的 XML 名称(带前缀),如果限定名不可用,则为空字符串
         */
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            // TODO 自动生成的方法存根
            super.endElement(uri, localName, qName);
            if(qName.equals("id")){
                book.setId(Integer.parseInt(builder.toString()));
            }else if(qName.equals("name")){
                book.setName(builder.toString());
            }else if(qName.equals("price")){
                book.setPrice(Float.parseFloat(builder.toString()));
            }else if(qName.equals("book")){
                list.add(book);
            }
        }
    
        @Override
        public void endDocument() throws SAXException {
            // TODO 自动生成的方法存根
            super.endDocument();
            
        }
    
        
    
        
    
    }

    ***test.java***

    package android_xml_sax;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.SAXException;
    
    public class test {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            
            SAXParserFactory factory = SAXParserFactory.newInstance();
            try {
                SAXParser parser = factory.newSAXParser();
                MySaxHandler handler = new MySaxHandler();
                parser.parse(new File("src/xml/book.xml"), handler);
                List<Book> list = handler.getList();
                for(Book book:list){
                    System.out.println(book.toString());
                }
            } catch (ParserConfigurationException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            } catch (SAXException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            
        }
    
    }

    ***Book.java***

    package android_xml_sax;
    
    public class Book {
        private int id;
        private String name;
        private float price;
        
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public float getPrice() {
            return price;
        }
    
        public void setPrice(float price) {
            this.price = price;
        }
    
        @Override
        public String toString() {
            return "id:" + id + ", name:" + name + ", price:" + price;
        }
    }

    ***book.xml***

    <?xml version="1.0" encoding="utf-8"?>
    <books>
        <book>
            <id>1</id>
            <name>Thinking In Java</name>
            <price>80.00</price>
        </book>
        <book>
            <id>2</id>
            <name>Core Java</name>
            <price>90.00</price>
        </book>
        <book>
            <id>3</id>
            <name>Hello, Andriod</name>
            <price>100.00</price>
        </book>
    </books>
  • 相关阅读:
    [程序员必备工具]分享一款不错的个人代码个人知识管理软件wiz
    移动开发,如何选择手机软件开发​平台?
    Best Wishes,my Married Friend!
    三年来最开心的一天!
    “世事无绝对”也是相对的……
    又到世界CUP……
    利物浦,总是在我情绪低落时给我鼓舞!
    一种感觉
    How to break to loop? It frustrates me!
    取舍有度,学会放弃……
  • 原文地址:https://www.cnblogs.com/bbglz/p/4576691.html
Copyright © 2011-2022 走看看