zoukankan      html  css  js  c++  java
  • sax解析xml

    web工程目录

    xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <persons>
        <person id="1">
            <name>张三</name>
            <age>23</age>
        </person>
        <person id="2">
            <name>李四</name>
            <age>25</age>
        </person>
    </persons>

    java源程序

    MyHandler类,存放数据

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class MyHandler extends DefaultHandler {
    
        private HashMap<String,String> map = null;//存储单个解析的完整对象
        private List<HashMap<String,String>> list = null;//存储所有的解析对象
        private String currentTag = null;//正在解析的元素的标签
        private String currentValue = null;//解析当前元素的值
        private String nodeName = null;//解析当前结点名称
        
        
        public MyHandler(String nodeName) {
            // TODO Auto-generated constructor stub
            this.nodeName = nodeName;
        }
        
        
        public List<HashMap<String, String>> getList() {
            return list;
        }
    
    
        public void setList(List<HashMap<String, String>> list) {
            this.list = list;
        }
    
    
        @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            //当读到第一个开始标签的时候,会触发这个方法
            list = new ArrayList<HashMap<String,String>>();
            
        }
        
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            // TODO Auto-generated method stub
            //当遇到文档的开头的时候调用这个方法
            if(qName.equals(nodeName)){
                map = new HashMap<String, String>();
                
            }
            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
            //这个方法是用来处理xml文件所读取到的内容
            if(currentTag!=null && map!=null){
                currentValue = new String(ch,start,length);
                if(currentValue!=null && !currentValue.trim().equals("")&&!currentValue.trim().equals("
    ")){
                    map.put(currentTag, currentValue);
                }
            }
            currentTag = null;//把当前节点的对应的值和标签设置为空
            currentValue = null;
        }
        
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            // TODO Auto-generated method stub
            //遇到结束标记的时候
            if(qName.equals(nodeName)){
                list.add(map);
                map=null;
                
            }
            super.endElement(uri, localName, qName);
        }
    
    }


    SaxService类,用于解析xml

    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.List;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import com.sax.handler.MyHandler;
    
    public class SaxService {
    
        public SaxService() {
            // TODO Auto-generated constructor stub
        }
    
        public static List<HashMap<String,String>> readXML(InputStream inputStream,String nodeName){
            try {
                //创建一个解析xml的工厂对象,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML文档
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser parser = spf.newSAXParser();//解析xml
                MyHandler handler = new MyHandler(nodeName);
                parser.parse(inputStream, handler);
                inputStream.close();
                return handler.getList();
            } catch (Exception e) {
                // TODO: handle exception
            }
            return null;
        }
    }

    工具类,用于获取url对象的输入流(xml)

    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class HttpUtils {
    
        public HttpUtils() {
            // TODO Auto-generated constructor stub
        }
    
        public static InputStream getXML(String path){
            InputStream inputStream = null;
            try {
                URL url = new URL(path);
                if(url!=null){
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setConnectTimeout(3000);
                    connection.setDoInput(true);
                    connection.setRequestMethod("GET");
                    int code = connection.getResponseCode();
                    if(code == 200){
                        inputStream = connection.getInputStream();
                    }
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
            return inputStream;
        }
    }

    测试类

    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.List;
    
    import com.sax.http.HttpUtils;
    import com.sax.sercice.SaxService;
    
    public class Test {
    
        public Test() {
            // TODO Auto-generated constructor stub
        }
     
        public static void main(String[] args) {
            String path = "http://169.254.32.172:8080/myhttp/person.xml";
            InputStream inputStream = HttpUtils.getXML(path);
            try {
                List<HashMap<String,String>> list = SaxService.readXML(inputStream, "person");
                for(HashMap<String,String> map : list){
                    System.out.println(map.toString());
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }

    结果:

    {id=1, age=23, name=张三}
    {id=2, age=25, name=李四}

  • 相关阅读:
    NodeJS NPM 镜像使用方法
    用for; while...do; do...while; 写出九九乘法表
    create-react-app创建的项目中registerServiceWorker.js文件的作用
    前端应该从哪些方面优化网站?
    JS基础整理面试题
    netcore实践:跨平台动态加载native组件
    iOS开发--Swift RAC响应式编程初探
    算法导论学习笔记 (页码:9 ~ 16)
    iOS开发-- 通过runtime kvc 移除导航栏下方的阴影效果线条
    iOS开发--面试
  • 原文地址:https://www.cnblogs.com/zyxiaohuihui/p/4537951.html
Copyright © 2011-2022 走看看