• Java用SAX解析XML


    要解析的XML文件:myClass.xml

    <?xml version="1.0" encoding="utf-8"?>
    <class>
    <stu id="001">
    <name>Allen</name>
    <sex>男</sex>
    <age>20</age>
    </stu>
    <stu id="002">
    <name>namy</name>
    <sex>女</sex>
    <age>18</age>
    </stu>
    <stu id="003">
    <name>lufy</name>
    <sex>男</sex>
    <age>18</age>
    </stu>
    </class>

    用SAX解析XML的Handler类:Myhandler.java

    /**
     * 用SAX解析XML的Handler
     */
    package com.xml.util;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class Myhandler extends DefaultHandler {
        //存储正在解析的元素的数据
        private Map<String,String> map=null;
        //存储所有解析的元素的数据
        private List<Map<String,String>> list=null;
        //正在解析的元素的名字
        String currentTag=null;
        //正在解析的元素的元素值
        String currentValue=null;
        //开始解析的元素
        String nodeName=null;
        
    
        public Myhandler(String nodeName) {
            // TODO Auto-generated constructor stub
            this.nodeName=nodeName;
        }
        
        public List<Map<String, String>> getList() {
            return list;
        }
    
        //开始解析文档,即开始解析XML根元素时调用该方法
        @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("--startDocument()--");
            //初始化Map
            list=new ArrayList<Map<String,String>>();
        }
        
        //开始解析每个元素时都会调用该方法
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            // TODO Auto-generated method stub
            //判断正在解析的元素是不是开始解析的元素
            System.out.println("--startElement()--"+qName);
            if(qName.equals(nodeName)){
                map=new HashMap<String, String>();
            }
            
            //判断正在解析的元素是否有属性值,如果有则将其全部取出并保存到map对象中,如:<person id="00001"></person>
            if(attributes!=null&&map!=null){
                for(int i=0;i<attributes.getLength();i++){
                    map.put(attributes.getQName(i), attributes.getValue(i));
                }
            }
            currentTag=qName;  //正在解析的元素
        }
        
        //解析到每个元素的内容时会调用此方法
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("--characters()--");
            if(currentTag!=null&&map!=null){
                currentValue=new String(ch,start,length);
                //如果内容不为空和空格,也不是换行符则将该元素名和值和存入map中
                if(currentValue!=null&&!currentValue.trim().equals("")&&!currentValue.trim().equals("
    ")){
                    map.put(currentTag, currentValue);
                    System.out.println("-----"+currentTag+" "+currentValue);
                }
                //当前的元素已解析过,将其置空用于下一个元素的解析
                currentTag=null;
                currentValue=null;
            }
        }
        
        //每个元素结束的时候都会调用该方法
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("--endElement()--"+qName);
            //判断是否为一个节点结束的元素标签
            if(qName.equals(nodeName)){
                list.add(map);
                map=null;
            }
        }
        
        //结束解析文档,即解析根元素结束标签时调用该方法
        @Override
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("--endDocument()--");
            super.endDocument();
        }
    }
  • 相关阅读:
    js跳出循环
    JavaScript prototype属性
    【DP专题】——洛谷P2279:消防局的设立
    转:android中dialog工具类的实现(多种dialog的创建)
    转:setContentView的时候,到底发生了什么
    转:Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别
    转:Android Studio中的Gradle是干什么的
    转:Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
    Android 学习
    com.baidu.navisdk.adapter找不到 在百度定位SDK的基础之上导入导航的SDK(针对新版本的坑!)
  • 原文地址:https://www.cnblogs.com/luerniu/p/5364934.html
Copyright © 2020-2023  润新知