站长论坛

标题: 使用Java自带SAX工具解析XML [打印本页]

作者: tzlink    时间: 2007-9-18 23:15
标题: 使用Java自带SAX工具解析XML
studentInfo.xml
  1. <?xml version="1.0" encoding="gb2312"?>

  2.     <!--如果没有age属性,默认的为20-->
  3.         崔卫兵
  4.         PC学院
  5.         62354666
  6.         男,1982年生,硕士,现就读于北京邮电大学
  7.    
  8.    
  9.         cwb
  10.         PC学院<!--如果没有leader属性,默

  11. 认的为leader-->
  12.         62358888
  13.         男,1987年生,硕士,现就读于中国农业大学
  14.    
  15.    
  16.         xxxxx
  17.         xxx学院
  18.         66666666
  19.         注视中,注释中
  20.    

复制代码
SAXHandler.java
  1. package saxExample;

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

  5. /**
  6. * 继承DefaultHandler类,用SAX实现对xml的遍历
  7. * @author cuiweibing
  8. * @since 2007.8.8
  9. */


  10. public class SAXHandler
  11.     extends DefaultHandler {
  12.   //存放所有的节点(这里的节点等于原来的节点+编号)以及它所对应的值
  13.   private HashMap hashMap = new HashMap();
  14.   //目前的节点
  15.   private String currentElement = null;
  16.   //目前节点所对应的值
  17.   private String currentValue = null;
  18.   //用于节点编号(具体到person)
  19.   private static int i=-1;

  20.   public HashMap getHashMap() {
  21.     return hashMap;
  22.   }

  23.   public void characters(char[] ch, int start, int length) throws SAXException {
  24.     //取出目前节点对应的值
  25.     currentValue = new String(ch, start, length);
  26.   }

  27.   public void startElement(String uri, String localName, String qName,
  28.                            Attributes attr) throws SAXException {
  29.     if(qName.equalsIgnoreCase("student")){
  30.       //currentElement= "";
  31.     }else if (qName.equalsIgnoreCase("person")){
  32.       i++;
  33.       //currentElement= "";
  34.       String age=attr.getValue("age");
  35.       if(age!=null){
  36.        hashMap.put(qName+"-age"+i, age);
  37.       }else{
  38.        hashMap.put(qName+"-age"+i, "20");
  39.       }
  40.     }else if (qName.equalsIgnoreCase("college")){
  41.         currentElement= qName;
  42.         String leader=attr.getValue("leader");
  43.         if(leader!=null){
  44.          hashMap.put(qName+"-leader"+i, leader);
  45.         }else{
  46.          hashMap.put(qName+"-leader"+i, "leader");
  47.         }
  48.     }else{
  49.       currentElement= qName;
  50.     }

  51.   }

  52.   public void endElement(String uri, String localName, String qName) throws SAXException {
  53.     if (qName.equalsIgnoreCase("student")){
  54. //      hashMap.put(currentElement, currentValue);
  55.     }else if (qName.equalsIgnoreCase("person")){

  56.     }else{
  57.       currentElement+=i;
  58.       hashMap.put(currentElement, currentValue);
  59.     }
  60.   }
  61. }
复制代码
TestSAXHandler.java
  1. package saxExample;

  2. import java.io.File;
  3. import java.util.HashMap;
  4. import javax.xml.parsers.SAXParserFactory;
  5. import javax.xml.parsers.SAXParser;

  6. /**
  7. * 解析主类
  8. * @author cuiweibing
  9. * @since 2007.8.8
  10. */


  11. public class TestSAXHandler {
  12.   public TestSAXHandler() {
  13.   }

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

  21.       //解析完后获取解析信息
  22.       HashMap hashMap = handler.getHashMap();
  23.       System.out.println("姓名\t年龄\t学院\t学院领导\t电话\t\t备注");
  24.       for(int i=0;i<hashMap.size();i+=6){
  25.         int j=i/6;
  26.         System.out.print(hashMap.get("name"+j)+"\t");
  27.         System.out.print(hashMap.get("person-age"+j)+"\t");
  28.         System.out.print(hashMap.get("college"+j)+"\t");
  29.         System.out.print(hashMap.get("college-leader"+j)+"\t");
  30.         System.out.print(hashMap.get("telephone"+j)+"\t");
  31.         System.out.println(hashMap.get("notes"+j)+"\t");
  32.       }
  33.     }catch(Exception ex){
  34.       ex.printStackTrace();
  35.     }
  36.   }
  37. }
复制代码





欢迎光临 站长论坛 (https://tzlink.com/bbs/) Powered by Discuz! X3.2