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


    先上代码:

    package com.saxparsetest;
    //the filename of this file is :saxparse.java
    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_2());//第二个参数用于关联下面定义的事件处理类
            
        }
    
    }
    
    //定义事件处理类
    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();
        }
    
    }
    
    
    //请思考:如何只显示部分元素及属性,如只显示名字,年龄。
    //现在再定义一个事件处理类:
    class myDefaultHandle_wodelei_2 extends DefaultHandler{
        
        
        @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            System.out.println("***********************************");//打印一行分割线
            super.startDocument();
        }
    
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            // TODO Auto-generated method stub
            super.startElement(uri, localName, qName, attributes);
        }
        
        @Override
        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("")) 
            {
                System.out.println(con);
            }
            super.characters(ch, start, length);
        }
        
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // TODO Auto-generated method stub
            super.endElement(uri, localName, qName);
        }
        
        @Override
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            super.endDocument();
        }
        
        
    }
    
    /*
     运行结果:
     ***********************************
    周星驰
    23
    学习刻苦
    林青霞
    32
    是一个好学生
     */

    现在我不想显示介绍部分的文本内容了(学习刻苦,是一个好学生),只想显示姓名和年龄。

    package com.saxparsetest;
    //the filename of this file is :saxparse.java
    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_2());//第二个参数用于关联下面定义的事件处理类
            
        }
    
    }
    
    //定义事件处理类
    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();
        }
    
    }
    
    
    //请思考:如何只显示部分元素及属性,如只显示名字,年龄。
    //现在再定义一个事件处理类:
    class myDefaultHandle_wodelei_2 extends DefaultHandler{
        
        private boolean isName=false;
        private boolean isAge=false;
        
        @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            super.startDocument();
        }
    
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            // TODO Auto-generated method stub
            super.startElement(uri, localName, qName, attributes);
        
            if(qName.equals("名字"))
            {
                this.isName=true;
            }
            else if(qName.equals("年龄"))
            {
                this.isAge=true;
            }
        }
        
        @Override
        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("")&&isName==true||isAge==true) 
            {
                System.out.println(con);
            }
            isName=false;
            isAge=false;
            //super.characters(ch, start, length);
        }
        
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // TODO Auto-generated method stub
            super.endElement(uri, localName, qName);
        }
        
        @Override
        public void endDocument() throws SAXException {
            // TODO Auto-generated method stub
            super.endDocument();
        }
        
        
    }
    
    /*
     运行结果:
    周星驰
    23
    林青霞
    32
     */
  • 相关阅读:
    C#调用C++代码遇到的问题总结
    ASP.NET MVC Controller的激活
    利用fis3自动化处理asp.net项目静态资源时遇到的一个编码问题
    工作中遇到的一个多线程下导致RCW无法释放的问题
    在mongoose中使用$match对id失效的解决方法
    passport源码研究
    android手机旋转屏幕时让GridView的列数与列宽度自适应
    git 版本回退
    梦之解读:如何成为牛人
    DataTable与DTO对象的简易转换类
  • 原文地址:https://www.cnblogs.com/yibeimingyue/p/9973805.html
Copyright © 2020-2023  润新知