zoukankan      html  css  js  c++  java
  • android平台中解析xml文件:SAX、PULL

    SAX利用事件解析机制占用内存非常少,非常适合手机等移动设备。SAX是事件

    驱动,事件定义在ContentHandler接口中,在ContentHandler常用方法有:

         //处理文本节点

    •characters(char[] ch, int start, int length)

         //结束节点时触发

    •endElement(String uri, String localName, String qName)

        // 开始文档时触发

    •startDocument()

        // 解析节点时触发 (qName:带命名空间前缀的标签名)

    •startElement(String uri, String localName, String qName, Attributes attributes)

        //结束文档时触发

    •endDocument()
    解析工具类
    public class XmlTool {
    public static List<User> readXmlSAX(InputStream inputStream) throws Exception{
    SAXParserFactory factory
    = SAXParserFactory.newInstance();
    SAXParser parser
    = factory.newSAXParser();
    MyDefaultHandler defaultHandler
    = new XmlTool().init();
    parser.parse(inputStream, defaultHandler);
    inputStream.close();
    return defaultHandler.getUsers();
    }
    public MyDefaultHandler init(){
    return new MyDefaultHandler();
    }

    public class MyDefaultHandler extends DefaultHandler{
    private List<User> users;
    private User user;
    private String content;

    public List<User> getUsers() {
    return users;
    }
    @Override
    public void characters(char[] ch, int start, int length)
    throws SAXException {
    super.characters(ch, start, length);
    content
    = new String(ch,start,length);
    }
    @Override
    public void startDocument() throws SAXException {
    users
    = new ArrayList<User>();
    }
    @Override
    public void startElement(String uri, String localName, String qName,
    Attributes attributes)
    throws SAXException {
    super.startElement(uri, localName, qName, attributes);
    if("user".equals(localName)){
    user
    = new User();
    user.setId(Integer.parseInt(attributes.getValue(
    "id")));
    }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
    throws SAXException {
    super.endElement(uri, localName, qName);
    if("name".equals(localName)){
    user.setName(content);
    }
    else if("password".equals(localName)){
    user.setPassword(content);
    }
    else if("user".equals(localName)){
    users.add(user);
    }
    }
    }
    }

    除了可以使用SAX解析xml文件,我们还可以使用PULL解析器。Android系统

    内置了Pull解析器。Pull解析器也是采用事件解析。

    Pull解析器主要的事件和方法

    XmlPullParser parser = Xml.newPullParser(); //获得pull解析器

    parser.setInput(fileInputStream, “utf-8”); //把xml文档以流的形式传给解析器

    int eventCode = parser.getEventType(); //获得解析事件返回的code

    XmlPullParser.START_DOCUMENT //开始文档

    XmlPullParser.END_DOCUMENT //结束文档

    XmlPullParser.START_TAG //开始节点

    XmlPullParser.END_TAG //结束节点

    eventCode = parser.next(); //解析下一个节点

    parser.getName() //获得节点名称

    parser.getAttributeValue(null, “id”)//获得节点属性

    parser.nextText()//获得test文本值

  • 相关阅读:
    单表查询
    解读python中SocketServer源码
    C++实训(2.3)
    C++实训(2.2)
    C++实训(2.1)
    C++实训(1.3)
    C++实训(1.1)
    顺序表的实现,在vs2019上运行成功
    p243_5(3)
    自考新教材-p176_5(2)
  • 原文地址:https://www.cnblogs.com/archie2010/p/2080260.html
Copyright © 2011-2022 走看看