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

使用场景:

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

原文地址:https://www.cnblogs.com/anni-qianqian/p/5243546.html