使用Java自带SAX工具解析XML

本文介绍了一个使用SAX解析XML文件的Java示例。通过创建SAXHandler类继承DefaultHandler,并实现特定的方法来解析XML文件中的数据。此外,还提供了一个测试类TestSAXHandler来展示如何使用SAXHandler进行解析。

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

包括三个文件:studentInfo.xml(待解析的xml文件),SAXHandler.java(解析的主要类),TestSAXHandler.java(测试解析的结果),代码分别如下(由于使用csdn blog自带的代码粘贴工具会朝里加入一些"..."字符,虽然利于查看,但是不利于把代码copy出来运行,而亲自运行代码对程序员来说是很重要的,故没有使用csdn blog自带的代码粘贴工具来插入代码,而是用着用直白的方式):

studentInfo.xml

<?xml version="1.0" encoding="gb2312"?>
<student>
    <person age="25"><!--如果没有age属性,默认的为20-->
        <name>崔卫兵</name>
        <college>PC学院</college>
        <telephone>62354666</telephone>
        <notes>男,1982年生,硕士,现就读于北京邮电大学</notes>
    </person>
    <person>
        <name>cwb</name>
        <college leader="leader1">PC学院</college><!--如果没有leader属性,默

认的为leader-->
        <telephone>62358888</telephone>
        <notes>男,1987年生,硕士,现就读于中国农业大学</notes>
    </person>
    <person age="45">
        <name>xxxxx</name>
        <college leader="学院领导">xxx学院</college>
        <telephone>66666666</telephone>
        <notes>注视中,注释中</notes>
    </person>
</student>

 

SAXHandler.java

package saxExample;

import java.util.HashMap;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 继承DefaultHandler类,用SAX实现对xml的遍历
 * @author cuiweibing
 * @since 2007.8.8
 */


public class SAXHandler
    extends DefaultHandler {
  //存放所有的节点(这里的节点等于原来的节点+编号)以及它所对应的值
  private HashMap<String,String> hashMap = new HashMap<String,String>();
  //目前的节点
  private String currentElement = null;
  //目前节点所对应的值
  private String currentValue = null;
  //用于节点编号(具体到person)
  private static int i=-1;
 
  public HashMap getHashMap() {
    return hashMap;
  }
 
  public void characters(char[] ch, int start, int length) throws SAXException {
    //取出目前节点对应的值
    currentValue = new String(ch, start, length);
  }
 
  public void startElement(String uri, String localName, String qName,
                           Attributes attr) throws SAXException {
    if(qName.equalsIgnoreCase("student")){
      //currentElement= "";
    }else if (qName.equalsIgnoreCase("person")){
      i++;
      //currentElement= "";
      String age=attr.getValue("age");
      if(age!=null){
       hashMap.put(qName+"-age"+i, age);
      }else{
       hashMap.put(qName+"-age"+i, "20");
      }
    }else if (qName.equalsIgnoreCase("college")){
        currentElement= qName;
        String leader=attr.getValue("leader");
        if(leader!=null){
         hashMap.put(qName+"-leader"+i, leader);
        }else{
         hashMap.put(qName+"-leader"+i, "leader");
        }
    }else{
      currentElement= qName;
    }
 
  }
 
  public void endElement(String uri, String localName, String qName) throws SAXException {
    if (qName.equalsIgnoreCase("student")){
//      hashMap.put(currentElement, currentValue);
    }else if (qName.equalsIgnoreCase("person")){
 
    }else{
      currentElement+=i;
      hashMap.put(currentElement, currentValue);
    }
  }
}

TestSAXHandler.java

 

package saxExample;

import java.io.File;
import java.util.HashMap;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;

/**
 * 解析主类
 * @author cuiweibing
 * @since 2007.8.8
 */


public class TestSAXHandler {
  public TestSAXHandler() {
  }

  public static void main(String[] args) {
    try{
      //初始化与解析
      SAXHandler handler = new SAXHandler();
      SAXParserFactory saxparserfactory = SAXParserFactory.newInstance();
      SAXParser saxparser = saxparserfactory.newSAXParser();
      saxparser.parse(new File("studentInfo.xml"), handler);

      //解析完后获取解析信息
      HashMap hashMap = handler.getHashMap();
      System.out.println("姓名/t年龄/t学院/t学院领导/t电话/t/t备注");
      for(int i=0;i<hashMap.size();i+=6){
        int j=i/6;
        System.out.print(hashMap.get("name"+j)+"/t");
        System.out.print(hashMap.get("person-age"+j)+"/t");
        System.out.print(hashMap.get("college"+j)+"/t");
        System.out.print(hashMap.get("college-leader"+j)+"/t");
        System.out.print(hashMap.get("telephone"+j)+"/t");
        System.out.println(hashMap.get("notes"+j)+"/t");
      }
    }catch(Exception ex){
      ex.printStackTrace();
    }
  }
}

运行的结果

姓名 年龄 学院 学院领导 电话  备注
崔卫兵 25 PC学院 leader 62354666 男,1982年生,硕士,现就读于北京邮电大学 
cwb 20 PC学院 leader1 62358888 男,1987年生,硕士,现就读于中国农业大学 
xxxxx 45 xxx学院 学院领导 66666666 注视中,注释中 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值