开发者社区> codingcoge> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

sax解析例子演示

简介:
+关注继续查看

实例1:使用sax解析读取xml文件,完整输出文档内容

主程序入口:

public static void main(String[] args)throws Exception {
        //1.创建SAXParser
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        //2.读取xml文件
        MyDefaultHandler2 handler = new MyDefaultHandler2();
        parser.parse(new File("./src/contact.xml"), handler);
        String content = handler.getContent();
        System.out.println(content);
    }

自定义类重写DefaultHandler方法

public class MyDefaultHandler2 extends DefaultHandler {
    //存储xml文档信息
    private StringBuffer sb = new StringBuffer();
    
    //获取xml信息
    public String getContent(){
        return sb.toString();
    }
    

    /**
     * 开始标签
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        sb.append("<"+qName);
        //判断是否有属性
        if(attributes!=null){
            for(int i=0;i<attributes.getLength();i++){
                //得到属性名称
                String attrName = attributes.getName(i);
                //得到属性值
                String attrValue = attributes.getValue(i);
                sb.append(" "+attrName+"=\""+attrValue+"\"");
            }
        }
        sb.append(">");
    }
    
    /**
     * 文本内容
     */
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //得到当前读取的文本
        String content = new String(ch,start,length);
        sb.append(content);
    }
    
    /**
     * 结束标签
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        sb.append("</"+qName+">");
    }
}

实例2:使用sax解析把 xml文档封装成对象:

主程序入口:

public static void main(String[] args)throws Exception {
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        MyDefaultHandler3 handler = new MyDefaultHandler3();
        parser.parse(new File(".\\src\\contact.xml"), handler);
        List<Contact> list = handler.getList();
        for (Contact contact : list) {
            System.out.println(contact);
        }
    }

自定义类重写DefaultHandler方法

public class MyDefaultHandler3 extends DefaultHandler {
    //存储所有联系人对象
    private List<Contact> list = new ArrayList<Contact>();
    
    public List<Contact> getList(){
        return list;
    }
    //保存一个联系人信息
    private Contact contact;
    /**
     * 思路: 
     *     1)创建Contact对象
     *  2)把每个contact标签内容存入到Contact对象
     *  3)把Contact对象放入List中
     */
    //用于临时存储当前读到的标签名
    private String curTag;

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        curTag = qName;
        //读取到contact的开始标签创建Contact对象
        if("contact".equals(qName)){
            contact = new Contact();
            
            //设置id值
            contact.setId(attributes.getValue("id"));
        }
    }
    
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //当前文本内容
        String content = new String(ch,start,length);
        
        if("name".equals(curTag)){
            contact.setName(content);
        }
        
        if("age".equals(curTag)){
            contact.setAge(content);
        }
        
        if("phone".equals(curTag)){
            contact.setPhone(content);
        }
        
        if("email".equals(curTag)){
            contact.setEmail(content);
        }
        
        if("qq".equals(curTag)){
            contact.setQq(content);
        }
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //设置空时为了避免空格换行设置到对象的属性中
        curTag = null;
        //读到contact的结束标签放入List中
        if("contact".equals(qName)){
            list.add(contact);
        }
    }
}

注意:为什么endElement要设置curTag = null?

因为 characters方法是遇到text文本就执行 ,如果遇到<contact>和<name>
之间的空格和换行 也会执行 ,而这时 curTag 还是原来的标签名字,这样子就会覆盖到对象的属性中,导致出现 空格换行覆盖原来属性。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
重走Ajax之路(二)
重走Ajax之路(二)
28 0
【AJAX】AJAX技术详细解析以及实例(2)
【AJAX】AJAX技术详细解析以及实例
61 0
Java解析XML(DOM解析和SAX解析)
Java解析XML(DOM解析和SAX解析)
138 0
Ajax-14:请求重复发送问题
Ajax-14:请求重复发送问题
51 0
Javasax解析器
  Javasax解析器,SAX(针对XML的简单API)是基于事件为XML文档的解析器。不像DOM解析器,SAX解析器创建没有解析树。SAX是一个流接口用于XML的,这意味着使用SAX应用接收事件通知有关XML文档被处理的元素,属性,在按顺序每次开始在文档的顶部,并与所述闭合结束根元素。
2470 0
【AJAX】AJAX技术详细解析以及实例
转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 Ajax技术介绍: 全称: Asynchronized(异步) Javascript And Xml 技术组成有: Javascript、DOM、CSS 和 XMLHttpRequest AJAX = 异步 JavaScript 和 XML。
1103 0
Java数据解析---SAX
一、Sax解析 是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档。 Sax采用事件驱动的方式解析文档。简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取) 在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或...
646 0
jQuery Ajax 实例演示
jQuery Ajax 实例演示 $(document).ready(function (){   $('#send_ajax').click(function (){     var params=$('input').
675 0
掌握 Ajax 系列
掌握 Ajax 系列 2007 年 8 月 28 号 更新   Ajax 无疑是最流行的新 Web 技术,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。
668 0
+关注
codingcoge
种一棵树最好的时间是十年前,其次是现在。 java自学后台ing,请多指教 Github: https://github.com/jjc123
文章
问答
文章排行榜
最热
最新
相关电子书
更多
《0代码搭应用》
立即下载
不止代码
立即下载
Python第五讲——关于爬虫如何做js逆向的思路
立即下载