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