对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文件进行遍历解析。
对xml文件的sax解析(增删改查)之一的更多相关文章
- 对xml文件的sax解析(增删改查)之二
先上代码: package com.saxparsetest; //the filename of this file is :saxparse.java import javax.xml.parse ...
- python(13)- 文件处理应用Ⅱ:增删改查
用户选择1,增加功能: 用户输入www.oldboy2.org和server 11111 weight 2222 maxconn 3333后, 在www.oldboy2.org下增加一条server信 ...
- SSMybatis整合 --详细解读Mybatis对oracle数据库进行增删改查(一)
Mybatis是现在主流的持久化层框架,与Hibernate不同的是,它鼓励程序员使用原声SQL语句对数据库进行操作.因此提供了非常灵活的功能.特别是当数据库同时访问数过多,需要进行优化时,使用sql ...
- Spring Boot入门系列(十八)整合mybatis,使用注解的方式实现增删改查
之前介绍了Spring Boot 整合mybatis 使用xml配置的方式实现增删改查,还介绍了自定义mapper 实现复杂多表关联查询.虽然目前 mybatis 使用xml 配置的方式 已经极大减轻 ...
- Mybatis的简单增删改查
刚开始学习Mybatis可以先看下官方文档,MyBatis是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis避免了几乎所有的JDBC代码和手工设置参数以及抽取结果集.MyBat ...
- NetCore2.0 RozarPage自动生成增删改查
原文链接:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swagger 上面的只是原文 ...
- 用dom4j解析xml文件并执行增删改查操作
转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...
- java对xml文件做增删改查------摘录
java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...
- 使用dom4j对xml文件进行增删改查
1.使用dom4j技术对dom_demo.xml进行增删改查 首选要下载dom4j的jar包 在官网上找不到,网上搜索了一下在这个链接:http://sourceforge.net/projects/ ...
随机推荐
- Java heap space设置方法记录
最近被 OutOfMemory Error折腾得够呛,记载一点设置JVM虚拟机内存Javaheap space的方法. Tomcat 7 参考: http://www.davidghedini.co ...
- Android中使用SDcard进行文件的读取
来自:http://www.cnblogs.com/greatverve/archive/2012/01/13/android-SDcard.html 平时我们需要在手机上面存储想音频,视频等等的大文 ...
- Linux文件内容查阅
直接查阅一个文件的内容:cat/tac/nl命令 cat (concatenate) # cat [-AbEnTv] 选项与參数: -A :相当於 -vET 的整合选项.可列出一些特殊字符而不是空白 ...
- Android Studio 设置项目Module编码,解决Android Studio项目执行时乱码问题
Android Studio的项目设置逻辑与Eclipse有非常大的差别.运行的操作为File->Setting->File Encodings然后来进行设置,如图所看到的: waterm ...
- 关于 AlphaGo 论文的阅读笔记
这是Deepmind 公司在2016年1月28日Nature 杂志发表论文 <Mastering the game of Go with deep neural networks and tre ...
- vs2012 MinGW 编译ffmeg 引用外部库libx264,librtmp
VS2012如何编译ffmpeg前面已经有文章讲过,本来主要讲述如何引用外部库libx264,librtmp, ffmpeg版本是3.0.2. 1. 下载x264源文件并编译 源码地址是http:// ...
- Oracle 【to_number】【instr】
需求:对一个包含数字的字符串排序 search后参考了 http://www.cnblogs.com/m-cnblogs/archive/2012/03/30/2425938.html 截屏: (用 ...
- bash的几个特殊参数和位置参量
http://blog.csdn.net/jiankun_wang/article/details/4336285 一.$*和$@ 首先介绍两个极其相似.很难区分的特殊参数$*和$@,先看如下输出: ...
- centos 在CentOS下编译FFmpeg
所需软件 准备 yum install autoconf automake gcc gcc-c++ git libtool make nasm pkgconfig zlib-devel -y 新版还 ...
- ios 博客集合
ryantang03 http://blog.csdn.net/ryantang03/article/category/1073221 kmyhy http://blog.csdn.net ...