XML解析(SAX详解)

来源:互联网 发布:巴西足球知乎 编辑:程序博客网 时间:2024/06/05 00:26

SAX(Simple APIs for XML 面向XML的简单APIs)也是程序接口。
Dom可以随机解析,首先将XMl文档加载到内存中,然后可以随机的方式访问访问内存中的DOM树。SAX是按顺序解析的,没必要把整个XML加载到内存中,一旦经过每个元素,我们在没有办法去访问他,因此SAX占用的内存小,效率更高。通常会使用SAX解析而不是DOM进行解析。

SAX以回调的形式进行解析。SAX用的是观察者模式(类似于GUI中的事件)。SAX接口称为事件驱动接口。

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.HandlerBase;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxTest1
{
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException
{
    //得到一个解析工厂实例
    SAXParserFactory factory = SAXParserFactory.newInstance();
    //得到一个SAX解析器
    SAXParser parser = factory.newSAXParser();
    //进行解析
    parser.parse(new File("student.xml"),new MyHander());
    
}
}
class MyHander extends DefaultHandler
{
    @Override
    public void startDocument() throws SAXException
    {
        System.out.println("parse begin");
    }
    @Override
    public void endDocument() throws SAXException
    {
        System.out.println("parse finished");
    }
    
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException
    {
        System.out.println("start element");
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException
    {
        System.out.println("finished element");
    }
}

XML Schema总结
简单元素:指只能包含文本内容,不包含子元素,也没有属性。
格式:<xs:element name="XX" type="xs:string"/>

<xs:element name="age" type="xs:string">

属性:所有的元素的属性均被定义为简单类型,只有复杂元素才可以拥有属性。
格式<xs:attribute name="xx" type="yyy"/>

所有属性默认情况下都是可选的,我们可以通过use关键字明确的指出是可选的或必要的。
<xs:attribute name="lang" type="xs:string" use="optional"/>
我们可以通过default或fixed为简单类型(简单元素,属性)
指定默认值或固定值。
<xs:element name="color" type="xs:string" default="red"/>