第一种: import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /* * 要解析的XML中的内容,根据xml创建javabean * <?xml version="1.0" encoding="utf-8"?> <Student> <student> <id>1</id> <name>张三</name> <age>22</age> </student> <student> <id>2</id> <name>李四</name> <age>20</age> </student> </Student> */ public class SaxHandle1 extends DefaultHandler{ private List<Student> list;//用来存放数据 Student stu; String tag; //tag用來保存XML文档的开始或结束标记名 //返回一个集合供测试类调用 public List<Student> getList(){ return list; } @Override public void startDocument() throws SAXException { System.out.println("开始文档解析"); list=new ArrayList<Student>();//开始就立刻建立集合 //表示两个<sutdent></student>中的内容,只作新建建集合 } @Override public void endDocument() throws SAXException { System.out.println("文档解析结束"); } //开始读取文档的标记,好比xml中自定义的<student>标记 //qName表示读取的标签或标记名 //attributes 标记里面的属性集合,即标记间的内容 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { tag=qName;//在开始赋值是为了,内容判断时判断是什么标记,下面的characters()要用来判断 if("student".equals(tag)){ stu=new Student();//元素开始说明就要建立对象 } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { //注意结束这里比较的是结束传进来的qName,而不是tagl了 if("student".equals(qName)){ list.add(stu);//结束时将对象添加到集合里 } tag="";//注意这里结束一个标记时要赋空值,不然下面还有对象时没法判断元素 } //标记与标记之间的内容 @Override public void characters(char[] ch, int start, int length) throws SAXException { String str=new String (ch,start,length);//获得标记之间的内容,给Student对象赋值 //在开始标记tag,就是在这里为了判断 if("id".equals(tag)){ stu.id=Integer.parseInt(str); }else if("name".equals(tag)){ stu.name=str; }else if("age".equals(tag)){ stu.age=Integer.parseInt(str); } } } 第二种: import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /* * XML中的内容,跟第一个不同的地方是,把id放在了<Student>标记里面,根据xml创建javabean <?xml version="1.0" encoding="utf-8" ?> <students> <student id="1"> <name>张三</name> <age>20</age> </student> <student id="2"> <name>李四</name> <age>22</age> </student> <student id="3"> <name>王五</name> <age>22</age> </student> </students> */ public class SaxHandle2 extends DefaultHandler{ private List<Student> list;//用来存放数据 Student stu; String tag; //返回一个集合供测试类调用 public List<Student> getList(){ return list; } //tag用來保存XML文档的开始或结束标记名 @Override public void startDocument() throws SAXException { System.out.println("开始解析文档,请稍后。。。。!"); list=new ArrayList<Student>();//开始就立刻建立集合 } @Override public void endDocument() throws SAXException { System.out.println("文档解析结束。。。。!!"); } //开始读取文档的标记,好比xml中自定义的<student>标记 //qName表示读取的标签或标记名 //attributes 标记里面的属性集合,即标记间的内容 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { tag=qName;//在开始赋值是为了,内容判断时判断是什么标记characters() if("student".equals(tag)){ stu=new Student();//元素开始说明就要建立对象 //id放在<student>里面后要在这里判断,遍历属性 for(int i=0;i<attributes.getLength();i++){ String name=attributes.getQName(i); String value=attributes.getValue(i); if("id".equals(name)){ stu.id=Integer.parseInt(value); } } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { //注意结束这里比较的是结束传进来的qName,而不是tagl了 if("student".equals(qName)){ list.add(stu);//结束时将对象添加到集合里 } tag="";//注意这里结束一个标记时要赋空值,不然下面还有对象时没法判断元素 } //标记与标记之间的内容 @Override public void characters(char[] ch, int start, int length) throws SAXException { String str=new String(ch,start,length);//获得标记之间的内容,给Student对象赋值 //在开始标记tag,就是在这里为了判断 if("name".equals(tag)){ stu.setName(str); }else if("age".equals(tag)){ stu.age=Integer.parseInt(str); } } } 测试类: import java.io.IOException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class TestSaxHandle1 { public static void main(String[] args) { //获得解析工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); try { //经过工厂获得解析器 SAXParser parser = factory.newSAXParser(); SaxHandle1 handle1=new SaxHandle1(); //将文件和handler、解析器相关联//文件路径不能是中文,最好不要有中文 parser.parse("e:\\Student2.xml", handle1); List<Student>list=handle1.getList(); //遍历打印出来 for(Student s:list){ System.out.println(s); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }