标签:
1 <?xml version="1.0" encoding="utf-8"?>
2 <class>
3 <stu id="001">
4 <name>Allen</name>
5 <sex>男</sex>
6 <age>20</age>
7 </stu>
8 <stu id="002">
9 <name>namy</name>
10 <sex>女</sex>
11 <age>18</age>
12 </stu>
13 <stu id="003">
14 <name>lufy</name>
15 <sex>男</sex>
16 <age>18</age>
17 </stu>
18 </class>
用SAX解析XML的Handler类:Myhandler.java
1 /**
2 * 用SAX解析XML的Handler
3 */
4 package com.xml.util;
5
6 import java.util.ArrayList;
7 import java.util.HashMap;
8 import java.util.List;
9 import java.util.Map;
10
11 import org.xml.sax.Attributes;
12 import org.xml.sax.SAXException;
13 import org.xml.sax.helpers.DefaultHandler;
14
15 public class Myhandler extends DefaultHandler {
16 //存储正在解析的元素的数据
17 private Map<String,String> map=null;
18 //存储所有解析的元素的数据
19 private List<Map<String,String>> list=null;
20 //正在解析的元素的名字
21 String currentTag=null;
22 //正在解析的元素的元素值
23 String currentValue=null;
24 //开始解析的元素
25 String nodeName=null;
26
27
28 public Myhandler(String nodeName) {
29 // TODO Auto-generated constructor stub
30 this.nodeName=nodeName;
31 }
32
33 public List<Map<String, String>> getList() {
34 return list;
35 }
36
37 //开始解析文档,即开始解析XML根元素时调用该方法
38 @Override
39 public void startDocument() throws SAXException {
40 // TODO Auto-generated method stub
41 System.out.println("--startDocument()--");
42 //初始化Map
43 list=new ArrayList<Map<String,String>>();
44 }
45
46 //开始解析每个元素时都会调用该方法
47 @Override
48 public void startElement(String uri, String localName, String qName,
49 Attributes attributes) throws SAXException {
50 // TODO Auto-generated method stub
51 //判断正在解析的元素是不是开始解析的元素
52 System.out.println("--startElement()--"+qName);
53 if(qName.equals(nodeName)){
54 map=new HashMap<String, String>();
55 }
56
57 //判断正在解析的元素是否有属性值,如果有则将其全部取出并保存到map对象中,如:<person id="00001"></person>
58 if(attributes!=null&&map!=null){
59 for(int i=0;i<attributes.getLength();i++){
60 map.put(attributes.getQName(i), attributes.getValue(i));
61 }
62 }
63 currentTag=qName; //正在解析的元素
64 }
65
66 //解析到每个元素的内容时会调用此方法
67 @Override
68 public void characters(char[] ch, int start, int length)
69 throws SAXException {
70 // TODO Auto-generated method stub
71 System.out.println("--characters()--");
72 if(currentTag!=null&&map!=null){
73 currentValue=new String(ch,start,length);
74 //如果内容不为空和空格,也不是换行符则将该元素名和值和存入map中
75 if(currentValue!=null&&!currentValue.trim().equals("")&&!currentValue.trim().equals("\n")){
76 map.put(currentTag, currentValue);
77 System.out.println("-----"+currentTag+" "+currentValue);
78 }
79 //当前的元素已解析过,将其置空用于下一个元素的解析
80 currentTag=null;
81 currentValue=null;
82 }
83 }
84
85 //每个元素结束的时候都会调用该方法
86 @Override
87 public void endElement(String uri, String localName, String qName)
88 throws SAXException {
89 // TODO Auto-generated method stub
90 System.out.println("--endElement()--"+qName);
91 //判断是否为一个节点结束的元素标签
92