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解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂.

    使用场景:

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

  • 相关阅读:
    Unity3D 5.3 新版AssetBundle使用方案及策略
    解构C#游戏框架uFrame兼谈游戏架构设计
    漫谈C#编程语言在游戏领域的应用
    TDD在Unity3D游戏项目开发中的实践
    趣说游戏AI开发:曼哈顿街角的A*算法
    “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”
    趣说游戏AI开发:对状态机的褒扬和批判
    使用TypeScript拓展你自己的VS Code!
    MVP社区巡讲-云端基础架构:12月5日北京站 12月12日上海站
    【转】Spring Boot干货系列:(一)优雅的入门篇
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5243546.html
Copyright © 2011-2022 走看看