• 对xml文件的sax解析(增删改查)之一


    crud(增删改查):

    c:creat

    r:retrieve

    u:update

    d:delete

    以下笔记来自于韩顺平老师的讲解。

    现在是用java来操作。

    第一步:新建java工程。file-new-Java Project,输入工程的名字,点击finish.

    第二步:放一个待解析的xml文件(classes.xml)到工程项目中的src目录中。

    classes.xml文件的内容是:

    <?xml version="1.0" encoding="UTF-8"?>
    <班级>
      <学生>
        <名字>周星驰</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
      </学生>
      <学生>
        <名字>林青霞</名字>
        <年龄>32</年龄>
        <介绍>是一个好学生</介绍>
      </学生>
    </班级>

    第三步:写一个java程序去解析这个xml文件。对着src右键,new-package,输入包名com.saxparsetest,点击finishl。

    第四步:对着com.saxparsetest右键,写一个测试java测试程序,new-class:

    第五步:可以愉快的开始写代码了。

    package com.saxparsetest;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class saxparse {
    
        public static void main(String[] args) throws Exception, SAXException {
            // TODO Auto-generated method stub
            //使用sax技术解析xml文件(有套路)。
            //第一步,创建SaxParserFactory:
            SAXParserFactory spf=SAXParserFactory.newInstance();
            //第二步,创建SaxParser解析器:
            SAXParser saxParser=spf.newSAXParser();
            //第三步,把xml文件和【事件处理对象】关联
            saxParser.parse("src/classes.xml",new myDefaultHandle_wodelei());//第二个参数用于关联下面定义的事件处理类
            
        }
    
    }
    //定义事件处理类
    class myDefaultHandle_wodelei extends DefaultHandler{
    
        @Override//该函数发现文档开始:
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("发现文档开始的函数:startDocument()");
            super.startDocument();
        }
    
        @Override//该函数顺序发现xml文件中的元素(【推的机制】):
        public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("元素名称:"+arg2);
            super.startElement(arg0, arg1, arg2, arg3);
        }
    
        @Override//该函数发现xml文件中的文本:
        public void characters(char[] ch, int start, int length) throws SAXException {
            // TODO Auto-generated method stub
            super.characters(ch, start, length);
        }
    
        @Override//该函数发现xml文件中一个元素的结束(即发现这样的标签:</xx>):
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // TODO Auto-generated method stub
            super.endElement(uri, localName, qName);
        }
        
        @Override//该函数发现整个xml文件的结束:
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("发现文档结束的函数:endDocument()");
            super.endDocument();
        }
    
    }
    
    /*
     运行结果:
     发现文档开始的函数:startDocument()
    元素名称:班级
    元素名称:学生
    元素名称:名字
    元素名称:年龄
    元素名称:介绍
    元素名称:学生
    元素名称:名字
    元素名称:年龄
    元素名称:介绍
    发现文档结束的函数:endDocument()
     */

    package com.saxparsetest;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class saxparse {
    
        public static void main(String[] args) throws Exception, SAXException {
            // TODO Auto-generated method stub
            //使用sax技术解析xml文件(有套路)。
            //第一步,创建SaxParserFactory:
            SAXParserFactory spf=SAXParserFactory.newInstance();
            //第二步,创建SaxParser解析器:
            SAXParser saxParser=spf.newSAXParser();
            //第三步,把xml文件和【事件处理对象】关联
            saxParser.parse("src/classes.xml",new myDefaultHandle_wodelei());//第二个参数用于关联下面定义的事件处理类
            
        }
    
    }
    //定义事件处理类
    class myDefaultHandle_wodelei extends DefaultHandler{
    
        @Override//该函数发现文档开始:
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("发现文档开始的函数:startDocument()");
            super.startDocument();
        }
    
        @Override//该函数顺序发现xml文件中的元素(【推的机制】):
        public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("元素名称:"+arg2);
            //super.startElement(arg0, arg1, arg2, arg3);//这句系统给的可以不要了
        }
    
        @Override//该函数发现xml文件中的文本:
        public void characters(char[] ch, int start, int length) throws SAXException {
            // TODO Auto-generated method stub
            //参数解释:ch其实是文档本身
            //显示文本内容:
            System.out.println(new String(ch,start,length));
            //super.characters(ch, start, length);//这句系统给的可以不要了
        }
    
        @Override//该函数发现xml文件中一个元素的结束(即发现这样的标签:</xx>):
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // TODO Auto-generated method stub
            super.endElement(uri, localName, qName);
        }
        
        @Override//该函数发现整个xml文件的结束:
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("发现文档结束的函数:endDocument()");
            super.endDocument();
        }
    
    }
    
    /*
     发现文档开始的函数:startDocument()
    元素名称:班级
    
      
    元素名称:学生
    
        
    元素名称:名字
    周星驰
    
        
    元素名称:年龄
    23
    
        
    元素名称:介绍
    学习刻苦
    
      
    
      
    元素名称:学生
    
        
    元素名称:名字
    林青霞
    
        
    元素名称:年龄
    32
    
        
    元素名称:介绍
    是一个好学生
    
      
    
    
    发现文档结束的函数:endDocument()
     */

    以上程序打印很多空行的原因是:xml文件中每个元素或属性值后面有空行。

    解决办法1,手工去掉空行,左右内容全部换到一行字,没有空行就不会打印空格了:

    解决办法2,在程序中加入判断:

    package com.saxparsetest;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class saxparse {
    
        public static void main(String[] args) throws Exception, SAXException {
            // TODO Auto-generated method stub
            //使用sax技术解析xml文件(有套路)。
            //第一步,创建SaxParserFactory:
            SAXParserFactory spf=SAXParserFactory.newInstance();
            //第二步,创建SaxParser解析器:
            SAXParser saxParser=spf.newSAXParser();
            //第三步,把xml文件和【事件处理对象】关联
            saxParser.parse("src/classes.xml",new myDefaultHandle_wodelei());//第二个参数用于关联下面定义的事件处理类
            
        }
    
    }
    //定义事件处理类
    class myDefaultHandle_wodelei extends DefaultHandler{
    
        @Override//该函数发现文档开始:
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("发现文档开始的函数:startDocument()");
            super.startDocument();
        }
    
        @Override//该函数顺序发现xml文件中的元素(【推的机制】):
        public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("元素名称:"+arg2);
            //super.startElement(arg0, arg1, arg2, arg3);//这句系统给的可以不要了
        }
    
        @Override//该函数发现xml文件中的文本:
        public void characters(char[] ch, int start, int length) throws SAXException {
            // TODO Auto-generated method stub
            String con=new String(ch,start,length);//这是接收到的文本内容
            if(!con.trim().equals("")) //trim()的目的是消除文本两端的空行
            {
                //参数解释:ch其实是文档本身
                //显示文本内容:
                System.out.println(new String(ch,start,length));
                //super.characters(ch, start, length);//这句系统给的可以不要了
            }
        }
        @Override//该函数发现xml文件中一个元素的结束(即发现这样的标签:</xx>):
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // TODO Auto-generated method stub
            super.endElement(uri, localName, qName);
        }
        
        @Override//该函数发现整个xml文件的结束:
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("发现文档结束的函数:endDocument()");
            super.endDocument();
        }
    
    }
    
    /*
     运行结果:
     发现文档开始的函数:startDocument()
    元素名称:班级
    元素名称:学生
    元素名称:名字
    周星驰
    元素名称:年龄
    23
    元素名称:介绍
    学习刻苦
    元素名称:学生
    元素名称:名字
    林青霞
    元素名称:年龄
    32
    元素名称:介绍
    是一个好学生
    发现文档结束的函数:endDocument()
     */

    或者:

    package com.saxparsetest;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class saxparse {
    
        public static void main(String[] args) throws Exception, SAXException {
            // TODO Auto-generated method stub
            //使用sax技术解析xml文件(有套路)。
            //第一步,创建SaxParserFactory:
            SAXParserFactory spf=SAXParserFactory.newInstance();
            //第二步,创建SaxParser解析器:
            SAXParser saxParser=spf.newSAXParser();
            //第三步,把xml文件和【事件处理对象】关联
            saxParser.parse("src/classes.xml",new myDefaultHandle_wodelei());//第二个参数用于关联下面定义的事件处理类
            
        }
    
    }
    //定义事件处理类
    class myDefaultHandle_wodelei extends DefaultHandler{
    
        @Override//该函数发现文档开始:
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("发现文档开始的函数:startDocument()");
            super.startDocument();
        }
    
        @Override//该函数顺序发现xml文件中的元素(【推的机制】):
        public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("元素名称="+arg2);
            //super.startElement(arg0, arg1, arg2, arg3);//这句系统给的可以不要了
        }
    
        @Override//该函数发现xml文件中的文本:
        public void characters(char[] ch, int start, int length) throws SAXException {
            // TODO Auto-generated method stub
            String con=new String(ch,start,length);//这是接收到的文本内容
            if(!con.trim().equals("")) //trim()的目的是消除文本两端的空行
            {
                //参数解释:ch其实是文档本身
                //显示文本内容:
                System.out.println(new String(ch,start,length));
                //super.characters(ch, start, length);//这句系统给的可以不要了
            }
        }
        @Override//该函数发现xml文件中一个元素的结束(即发现这样的标签:</xx>):
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // TODO Auto-generated method stub
            super.endElement(uri, localName, qName);
        }
        
        @Override//该函数发现整个xml文件的结束:
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("发现文档结束的函数:endDocument()");
            super.endDocument();
        }
    
    }
    
    /*
     运行结果:
     发现文档开始的函数:startDocument()
    元素名称=班级
    元素名称=学生
    元素名称=名字
    周星驰
    元素名称=年龄
    23
    元素名称=介绍
    学习刻苦
    元素名称=学生
    元素名称=名字
    林青霞
    元素名称=年龄
    32
    元素名称=介绍
    是一个好学生
    发现文档结束的函数:endDocument()
     */

     小结:sax技术的一个缺陷是不能对xml文件进行增、删、改,它主要用来对xml文件进行遍历解析。 

  • 相关阅读:
    从数据库表中查询日期最新的记录
    ArcGIS js api开发环境配置
    HRESULT:0x80070057 (E_INVALIDARG)
    ArcGIS js api三种查询功能
    sql设置字段默认值
    文件后缀与mime类型对应表
    关于dojo自定义类
    android用户登录验证
    java实现QQ互联登录
    springboot实现网站微信扫码登录
  • 原文地址:https://www.cnblogs.com/yibeimingyue/p/9973568.html
Copyright © 2020-2023  润新知