对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文件进行遍历解析。 

 

posted on 2018-11-17 12:57  一杯明月  阅读(1332)  评论(0编辑  收藏  举报