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

Posted yibeimingyue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对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
 */

 

以上是关于对xml文件的sax解析(增删改查)之二的主要内容,如果未能解决你的问题,请参考以下文章

xml(3)

Dom4j与sax 简单对比

XML.03-DOM和SAX解析

android中如何对xml中存储的数据进行增删改查?求完整的例子。谢谢

Xml的转义字符--约束-xml解析器

Java 解析 XML