XML解析-SAX解析

原理

SAX,全称Simple API for XML,是一种以事件驱动的XMl API,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。顺序读取,不用一次装载整个文件,遇到标签会触发一个事件,适合对XML的顺序访问,占用内存资源稍小

优缺点

  1. 优点
    解析速度快
    占用内存少
  2. 缺点:
    只能读取XML,无法修改XML
    无法随机访问某个标签(节点)

解析过程

  1. 得到xml文件对应的资源,可以是xml的输入流,文件和uri

     File file = new File("C:\\\\Users\\\\Administrator\\\\Desktop\\\\books.xml");
     DefaultHandler defaultHandler = new SaxParserHandler();
    

    其中,SaxParserHandler是继承的DefaultHandler抽象类,该类是SAX解析的核心所在,我们要重写以下几个我们关心的方法。
    startDocument():文档解析开始时调用,该方法只会调用一次
    startElement(String uri, String localName, String qName, Attributes attributes):标签(节点)解析开始时调用
            uri:xml文档的命名空间
            localName:标签的名字
            qName:带命名空间的标签的名字
            attributes:标签的属性集
    characters(char[] ch, int start, int length):解析标签的内容的时候调用
            ch:当前读取到的TextNode(文本节点)的字节数组
            start:字节开始的位置,为0则读取全部
            length:当前TextNode的长度
    endElement(String uri, String localName, String qName):标签(节点)解析结束后调用
    endDocument():文档解析结束后调用,该方法只会调用一次

    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    
    public class SaxParserHandler extends DefaultHandler {
        //文档开始
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            System.out.println("解析开始");
        }
        //文档结束
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
            System.out.println("解析结束");
        }
        //遍历开始标签
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            System.out.print("<"+qName);
            for(int i=0;attributes!=null&&i<attributes.getLength();i++){
                String attName=attributes.getQName(i);
                String attValueString=attributes.getValue(i);
                System.out.print(" "+attName+"="+attValueString);
            }
            System.out.print(">\n");
        }
        //遍历结束标签
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            System.out.print("</"+qName+">");
        }
        //获取元素值
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            //得到当前文本内容
            String content = new String(ch,start,length);
            System.out.println(content);
        }
    }
    
  2. 得到SAX解析工厂(SAXParserFactory)

      //2.创建解析工厂
      SAXParserFactory factory= SAXParserFactory.newInstance();
    
  3. 由解析工厂生产一个SAX解析器(SAXParser)

     //3.通过工厂获取SaxParser实例,得到解析器
     SAXParser sp=factory.newSAXParser();
    
  4. 传入输入流和handler给解析器,调用parse()解析

        //2,3,4步可以合成一步,
        sp.parse(file,defaultHandler);
        //3.得到解读器
        //        XMLReader reader=sp.getXMLReader();
        //4.设置内容处理器
        //        reader.setContentHandler(defaultHandler);
        //5.读取xml的文档内容
        //        reader.parse("C:\\Users\\Administrator\\Desktop\\books.xml");
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值