1.先編寫要解析的xml檔案:
<?xml version="1.0" encoding="utf-8"?>
<class>
<stu id="001">
<name>Allen</name>
<sex>男</sex>
<age>20</age>
</stu>
<stu id="002">
<name>namy</name>
<sex>女</sex>
<age>18</age>
</stu>
<stu id="003">
<name>lufy</name>
<sex>男</sex>
<age>19</age>
</stu>
</class>
2.編寫要轉換的實體類:PersonBean
package com.xml.util;
public class PersonBean {
private String name;
private String sex;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
3.編寫xml解析檔案繼承DefaultHandler
/**
* 用SAX解析XML的Handler
*/
package com.xml.util;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Myhandler extends DefaultHandler {
//存儲正在解析的元素的資料
private Map<String,String> map=null;
//存儲所有解析的元素的資料
private List<Map<String,String>> list=null;
private List<PersonBean> personList =null;
PersonBean person =null;
//正在解析的元素的名字
String currentTag=null;
//正在解析的元素的元素值
String currentValue=null;
//開始解析的元素
String nodeName=null;
public Myhandler(String nodeName) {
this.nodeName=nodeName;
}
public List<Map<String, String>> getList() {
return list;
}
public List<PersonBean> getPersonList(){
return personList;
}
//開始解析文檔,即開始解析XML根元素時調用該方法
@Override
public void startDocument() throws SAXException {
System.out.println("--startDocument()--");
//初始化Map
list=new ArrayList<Map<String,String>>();
personList=new ArrayList<PersonBean>();
}
//開始解析每個元素時都會調用該方法
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//判斷正在解析的元素是不是開始解析的元素
System.out.println("--startElement()--"+qName);
if(qName.equals(nodeName)){
map=new HashMap<String, String>();
person=new PersonBean();
}
//判斷正在解析的元素是否有屬性值,如果有則将其全部取出并儲存到map對象中,如:<person id="00001"></person>
if(attributes!=null&&map!=null){
for(int i=0;i<attributes.getLength();i++){
map.put(attributes.getQName(i), attributes.getValue(i));
}
}
currentTag=qName; //正在解析的元素
}
//解析到每個元素的内容時會調用此方法
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println("--characters()--");
if(currentTag!=null&&map!=null){
currentValue=new String(ch,start,length);
//如果内容不為空和空格,也不是換行符則将該元素名和值和存入map中
if(currentValue!=null&&!currentValue.trim().equals("")&&!currentValue.trim().equals("\n")){
map.put(currentTag, currentValue);
Field[] allFields = PersonBean.class.getDeclaredFields();
for (int i = 0; i < allFields.length; i++) {
if(allFields[i].getName().equals(currentTag)){
String firstLetter = allFields[i].getName().substring(0, 1)
.toUpperCase();
String setter = "set" + firstLetter
+ allFields[i].getName().substring(1);
try {
Method method = person.getClass().getMethod(setter,allFields[i].getType());
try {
method.invoke(person, currentValue);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
System.out.println("-----"+currentTag+": "+currentValue);
}
//目前的元素已解析過,将其置空用于下一個元素的解析
currentTag=null;
currentValue=null;
}
}
//每個元素結束的時候都會調用該方法
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
System.out.println("--endElement()--"+qName);
//判斷是否為一個節點結束的元素标簽
if(qName.equals(nodeName)){
list.add(map);
map=null;
}
if(qName.equals("age")){
personList.add(person);
person=null;
}
}
//結束解析文檔,即解析根元素結束标簽時調用該方法
@Override
public void endDocument() throws SAXException {
System.out.println("--endDocument()--");
super.endDocument();
}
}
4.解析xml的方法
/**
* 封裝解析業務類
*/
package com.xml.service;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import com.xml.util.Myhandler;
import com.xml.util.PersonBean;
public class SaxService {
public static List<Map<String,String>> ReadXML(String uri,String NodeName){
try {
//建立一個解析XML的工廠對象
SAXParserFactory parserFactory=SAXParserFactory.newInstance();
//建立一個解析XML的對象
SAXParser parser=parserFactory.newSAXParser();
//建立一個解析助手類
Myhandler myhandler=new Myhandler("stu");
parser.parse(uri, myhandler);
return myhandler.getList();
} catch (Exception e) {
e.printStackTrace();
}finally{
}
return null;
}
public static List<PersonBean> Read2XML(String uri,String NodeName){
try {
//建立一個解析XML的工廠對象
SAXParserFactory parserFactory=SAXParserFactory.newInstance();
//建立一個解析XML的對象
SAXParser parser=parserFactory.newSAXParser();
//建立一個解析助手類
Myhandler myhandler=new Myhandler("stu");
parser.parse(uri, myhandler);
return myhandler.getPersonList();
} catch (Exception e) {
e.printStackTrace();
}finally{
}
return null;
}
}
5.編寫main主方法調用解析代碼:
/**
* 程式入口
*/
package com.xml.sax;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.xml.service.SaxService;
import com.xml.util.PersonBean;
public class XmlSaxTest {
/**
* @param args
*/
public static void main(String[] args) {
ArrayList<Map<String, String>> list=(ArrayList<Map<String, String>>) SaxService.ReadXML("D:\\Program Files\\DNA Workspace\\Test\\myClass.xml","class");
/*for(int i=0;i<list.size();i++){
HashMap<String, String> temp=(HashMap<String, String>) list.get(i);
Iterator<String> iterator=temp.keySet().iterator();
while(iterator.hasNext()){
String key=iterator.next().toString();
String value=temp.get(key);
System.out.print(key+" "+value+"--");
}
}*/
List<PersonBean> personList =SaxService.Read2XML("D:\\Program Files\\DNA Workspace\\Test\\myClass.xml","class");
System.out.println(list.toString());
System.out.println("最新的xml解析:"+personList.toString());
}
}
源碼下載下傳位址:http://download.csdn.net/detail/w2393040183/9582334