zoukankan      html  css  js  c++  java
  • XMLSAX解析

    * HTML不区分大小写,XML区分大小写
    * 用浏览器打开xml文件,判断xml文件是否有错
    * xml与html的区别

            1:xml的标记可以自定义,但是html标记不可以定义。<student></student>
            2:作用上。xml目的是为了传输数据,但是html更多的是为了显示数据。
            3:xml语言区分大小写。但是html不区分大小写
            4:xml文件的后缀为xml,html文件的后缀为html或者htm

    * xml文件的组成:前导区和数据区

    前导区:<?xml version="1.0" encoding="utf-8" ?>
    数据区
    <books>
        <book>
            <id>1</id>
            <name>android实战教程</name>
            <price>87.23</price>
        </book>
    </books>

    * java源码在jdk中src里面

    XML解析

    * 首先要继承DefaultHandler,重写startDocument、endDocument、startElement、endElement、characters方法

    public class StudentHandler extends DefaultHandler {
    private List<Student> list;
    private Student stu;
    private String tag;// 保存标记名
    
    // 返回解析到的集合。
    public List<Student> getList() {
        return list;
    }
    
    @Override
    public void startDocument() throws SAXException {
        System.out.println("文档开始解析");
        list = new ArrayList<Student>();
    }
    
    @Override
    public void endDocument() throws SAXException {
        System.out.println("文档解析结束");
    }
    
    // 开始标记
    // qName;表示标签名
    // attributes:属性集合
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        tag = qName;  //student  id
        if ("student".equals(tag)) {
            stu = new Student();
            //遍历属性。
            for(int i=0;i<attributes.getLength();i++){
                String name = attributes.getQName(i);
                String value = attributes.getValue(i);
                System.out.println(name+"---"+value);
                //判断属性名称
                if("id".equals(name)){
                    stu.id = Integer.parseInt(value);
                }
            }
        }
    }
    
    // 结束标记
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if ("student".equals(qName)) {
            list.add(stu);
        }
        tag = "";
    }
    
    // 标记与标记之间的内容
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        String str = new String(ch, start, length);
        System.out.println(str);
        // 判断标记
         if ("name".equals(tag)) {
            stu.name = str;
        } else if ("age".equals(tag)) {
            stu.age = Integer.parseInt(str);
        }
    
    }

    启动方法

    //得到解析工厂。
    SAXParserFactory factory = SAXParserFactory.newInstance();
    //通过工厂得到解析器。
    SAXParser parser = factory.newSAXParser();
    StudentHandler handler = new StudentHandler();
    //将文件和Handler,和解析器相关联。
    parser.parse("f:\students.xml", handler);
    //需要得到解析后的集合。
    List<Student> list = handler.getList();
    for(Student s:list){
        System.out.println(s);
    }

    * 安卓中xml默认解析方式是pull

    优点:

    SAX 对内存的要求比较低,因为它让开发人员自己来决定所要处理的标签.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现.

    缺点:

    用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂.

    使用场景:

    对于含有数据量十分巨大,而又不用对文档的所有数据进行遍历或者分析的时候,使用该方法十分有效.该方法不用将整个文档读入内存,而只需读取到程序所需的文档标签处即可.

  • 相关阅读:
    针对Python基本数据类型的操作
    Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from 这类问题的解决方法
    校招有感:计算机专业毕业生如何找工作(Java方向)
    我用了半年的时间,把python学到了能出书的程度
    Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展示值钱技能
    Java字节码与反射机制
    以我的亲身经历,聊聊学python的流程,同时推荐学python的书
    面试时通过volatile关键字,全面展示线程内存模型的能力
    如果很好说出finalize用法,面试官会认为你很资深
    C# post json和接收json
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5243546.html
Copyright © 2011-2022 走看看