当前位置: 首页 > news >正文

使用Java自带SAX工具解析XML

 

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();
    }
  }
}

相关文章:

  • 使用SAX解析XML (控制台程序)
  • PMI列子1
  • 一个简单实用的AJAX例子
  • VS使用技巧
  • 一个最简单的AJAX实例及解析
  • 静态库中有图片,改如何存放呢??
  • 用Java结合SAX 2.0 解析XML文档
  • HDU 2594 Simpsons’ Hidden Talents(辛普森一家的潜在天赋)
  • 在Dom4j中使用xpath
  • C# 文件与目录的基本操作(System.IO)
  • 在JavaScript中使用Java
  • Postgresql 同步流复制
  • ??在JSP中,java和JavaScript如何交互?
  • 在Struts应用中使用Ajax
  • jQuery计算文本宽度和input标签根据输入字符动态自适应宽度的实现
  • 03Go 类型总结
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • flask接收请求并推入栈
  • go语言学习初探(一)
  • HTTP--网络协议分层,http历史(二)
  • idea + plantuml 画流程图
  • js 实现textarea输入字数提示
  • nginx 配置多 域名 + 多 https
  • React-生命周期杂记
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 编写高质量JavaScript代码之并发
  • 关于extract.autodesk.io的一些说明
  • 前端自动化解决方案
  • 一个JAVA程序员成长之路分享
  • 异步
  • 怎么将电脑中的声音录制成WAV格式
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #stm32驱动外设模块总结w5500模块
  • $.ajax中的eval及dataType
  • $refs 、$nextTic、动态组件、name的使用
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (k8s中)docker netty OOM问题记录
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)模仿学习-完成后台管理页面查询
  • .Family_物联网
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core 项目指定SDK版本
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET中统一的存储过程调用方法(收藏)
  • ?
  • @html.ActionLink的几种参数格式
  • [ 蓝桥杯Web真题 ]-布局切换
  • []我的函数库
  • [ACTF2020 新生赛]Upload 1
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [C++]打开新世界的大门之C++入门
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径