sax解析例子演示

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

实例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 还是原来的标签名字,这样子就会覆盖到对象的属性中,导致出现 空格换行覆盖原来属性。

目录
相关文章
|
6月前
|
XML JavaScript Java
【JAVA XML 探秘】DOM、SAX、StAX:揭秘 Java 中 XML 解析技术的终极指南!
【8月更文挑战第25天】本文详细探讨了Java中三种主流的XML解析技术:DOM、SAX与StAX。DOM将XML文档转换为树状结构,便于全方位访问和修改;SAX采取事件驱动模式,适用于大型文件的顺序处理;StAX则兼具DOM和SAX的优点,支持流式处理和随机访问。文中提供了每种技术的示例代码,帮助读者理解如何在实际项目中应用这些解析方法。
268 1
|
6月前
|
XML JavaScript API
DOM 和 SAX 解析器之间的区别
【8月更文挑战第22天】
82 0
|
6月前
|
XML JavaScript Java
Java 中 DOM 和 SAX 解析器之间的区别
【8月更文挑战第22天】
46 0
|
9月前
|
XML JavaScript Java
Java一分钟之-XML解析:DOM, SAX, StAX
Java中的XML解析包括DOM、SAX和StAX三种方法。DOM将XML加载成内存中的树形结构,适合小文件和需要随意访问的情况,但消耗资源大。SAX是事件驱动的,逐行读取,内存效率高,适用于大型文件,但编程复杂。StAX同样是事件驱动,但允许程序员控制解析流程,低内存占用且更灵活。每种方法都有其特定的易错点和避免策略,选择哪种取决于实际需求。
189 0
|
XML 存储 JavaScript
SAX解析XML
SAX解析XML
96 0
|
XML API 数据格式
sax 解析的过程| 学习笔记
快速学习 sax 解析的过程。
sax 解析的过程| 学习笔记
|
XML JavaScript 安全
Java解析XML(DOM解析和SAX解析)
Java解析XML(DOM解析和SAX解析)
819 0
Java解析XML(DOM解析和SAX解析)
|
XML C语言 数据格式
iOS SAX解析XML
先从网络获取XML文件 NSURL *url = [NSURL URLWithString:@"https://127.0.0.1/videos.
869 0
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
128 2

推荐镜像

更多