SAX(simple api for xml,也可以说是jsr172)学习笔记

本文通过具体示例介绍如何使用SAX方式解析XML文件。详细展示了MySax类与MyHandler类的实现过程,包括创建SAX解析器、定义解析器事件处理方法等,并给出了完整的代码及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 先看例子代码:

 

MySax.java:

 

package mySax;

import java.io.FileInputStream;
import java.io.InputStream;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class MySax {
 
 public static void main(String[] args){
  try{
      SAXParserFactory factory = SAXParserFactory.newInstance();    //新建一个工厂类
      SAXParser saxParser = factory.newSAXParser();                         //从工厂类中提取出一个saxParser 
      InputStream is = new FileInputStream("res/phone.xml");           //将文件流化 
      saxParser.parse(is,new MyHandler());                                         //调用解析的方法                              
  }catch(Exception e){
   e.printStackTrace();
  }
 }

}

 

MyHandler.java:

 

package mySax;

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

public class MyHandler extends DefaultHandler {
 
 
 //覆盖文档开始处理的方法
 public void startDocument() throws SAXException {
         System.out.println("开始处理xml文件");
 }
 
 //覆盖文档结束处理的方法
 public void endDocument() throws SAXException {
         System.out.println("结束处理xml文件");
    }
 
 
 //覆盖节点开始处理的方法
 public void startElement(String uri, String localName, String qName,

            Attributes attributes) throws SAXException {
    System.out.println("节点名" + qName + "开始");
    if(attributes.getLength() > 0){
     for(int i = 0;i < attributes.getLength();i ++){
      System.out.println("属性" + i + ":" + attributes.getQName(i) + "它的值是" + attributes.getValue(i));
     }
    }
 }
 
 //覆盖节点之间字符处理的方法
 public void characters(char[] ch, int start, int length)

    throws SAXException {
    System.out.println("节点中的值" + new String(ch,start,length));
    }
 
 //覆盖节点结束处理的方法
 public void endElement(String uri, String localName, String qName)

    throws SAXException {
    System.out.println("节点名" + qName + "结束");
 }
}

 

res/phone.xml文件:

 

<sonyericsson>
<phone id="Nokia_phone">
<name>Nokia</name>
<colour>black</colour>
</phone>
<phone id="moto_phone" type="good">
<name>motov300</name>
<color>blue</color>
</phone>
</sonyericsson>

 

这里我主要来讲一下MyHandler 的执行过程。

MyHandler是继承自类DefaultHandler ,然后我们可以覆盖DefaultHandler 类的方法。

MyHandler是一边读xml文件一边对xml文件进行解析的。

1.首先调用startDocument()宣布对xml文件开始处理。

2.当遇到开始节点时,调用startElement(String uri, String localName, String qName, Attributes attributes) 进行处理,attributes是该节点内的属性,我们也可以对这些属性进行相应的操作。

3.然后对开始节点后的字符进行处理,调用characters(char[] ch, int start, int length)方法。

4.当遇到结束节点时,调用endElement(String uri, String localName, String qName)进行处理。

5.然后对结束节点后的字符进行处理,调用characters(char[] ch, int start, int length)方法。

6.最后调用endDocument() 宣布对xml文件处理结束。

 

最后的输出结果是:

 

开始处理xml文件
节点名sonyericsson开始
节点中的值

节点名phone开始
属性0:id它的值是Nokia_phone
节点中的值
节点名name开始
节点中的值Nokia
节点名name结束
节点中的值
节点名colour开始
节点中的值black
节点名colour结束
节点中的值
节点名phone结束
节点中的值
节点名phone开始
属性0:id它的值是moto_phone
属性1:type它的值是good
节点中的值
节点名name开始
节点中的值motov300
节点名name结束
节点中的值
节点名color开始
节点中的值blue
节点名color结束
节点中的值
节点名phone结束
节点中的值
节点名sonyericsson结束
结束处理xml文件

 

对照着XML文件看,很容易就能明白了。

 

我们也可以在方法中根据需求加入相应的处理。sax非常好用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值