java中使用sax解析xml,以實體類集合的方式接受xml解析的值
阿新 • • 發佈:2019-02-04
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