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