随笔 - 1761  文章 - 0  评论 - 109  阅读 - 431万

对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
 */
复制代码

 

posted on   一杯明月  阅读(510)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示