zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    www.insidesql.org
    kevinekline----------------- SQLSERVER MVP
    Sys.dm_os_wait_stats Sys.dm_performance_counters
    如何使用 DBCC MEMORYSTATUS 命令来监视 SQL Server 2005 中的内存使用情况
    VITAM POST MORTEM – ANALYZING DEADLOCKED SCHEDULERS MINI DUMP FROM SQL SERVER
    Cargo, Rust’s Package Manager
    建筑识图入门(初学者 入门)
    Tracing SQL Queries in Real Time for MySQL Databases using WinDbg and Basic Assembler Knowledge
    Microsoft SQL Server R Services
    The Rambling DBA: Jonathan Kehayias
  • 原文地址:https://www.cnblogs.com/luerniu/p/5364934.html
Copyright © 2011-2022 走看看