先上代码:
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 */