58,454
社区成员
发帖
与我相关
我的任务
分享
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
/**
*
* @author Administrator
*
*/
@SuppressWarnings("unchecked")
public class XmlUtil {
public static List praseXmlToList(String xmlStr,Object obj) throws SAXException, IOException {
return praseXmlToList(new InputSource(new StringReader(xmlStr)), obj.getClass());
}
public static List praseXmlToList(String xmlStr,Class clazz) throws SAXException, IOException {
return praseXmlToList(new InputSource(new StringReader(xmlStr)), clazz);
}
public static List praseXmlToList(File file,Object obj) throws FileNotFoundException, SAXException, IOException {
return praseXmlToList(new InputSource(new FileInputStream(file)), obj.getClass());
}
public static List praseXmlToList(File file,Class clazz) throws FileNotFoundException, SAXException, IOException {
return praseXmlToList(new InputSource(new FileInputStream(file)), clazz);
}
public static List praseXmlToList(InputSource source,Object obj) throws SAXException, IOException {
return praseXmlToList(source,obj.getClass());
}
public static List praseXmlToList(InputSource source,Class clazz) throws SAXException, IOException {
MyHandler handler = new XmlUtil().new MyHandler(clazz);
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(handler);
reader.setErrorHandler(handler);
reader.parse(source);
return handler.getList();
}
/**
*
* @param args
* @throws SAXException
* @throws IOException
* @throws DocumentException
*/
public static void main(String [] args) throws SAXException, IOException, DocumentException {
//解析对应的JavaBean
PIWSKC00 bean = new PIWSKC00();
//SAX
List ls = XmlUtil.praseXmlToList(new File("d:/test3.xml"),bean);
System.out.println(ls.size());
//DOM4J
MyXmlReader rd = new XmlUtil().new MyXmlReader(bean.getClass());
List li2 = rd.parseXml(new File("d:/test3.xml"));
System.out.println(li2.size());
}
class MyHandler extends DefaultHandler {
/**当前标签名*/
private String preTag = "";
/**解析对象标志,在DataRow标签开关之间为true*/
private boolean curTag = false;
/**保存已经解析的JavaBean*/
private List list;
/**解析对象的Class*/
private Class clazz;
/**解析对象*/
private Object bean;
/**解析对象的所有字段*/
private Field[] fields;
/**保存解析对象各个字段的Class*/
private Map<String,Class> sortedFields;
/**
* 初始化clazz和fields
* @param clazz
*/
public MyHandler(Class clazz) {
this.clazz = clazz;
this.fields = clazz.getDeclaredFields();
}
/**
* 解析开始初始化sortedFields和需要返回的List
*/
@Override
public void startDocument() throws SAXException {
if(null == list)
list = new ArrayList();
else
list.clear();
if(null == sortedFields)
sortedFields = new HashMap<String,Class>();
else
sortedFields.clear();
for(int i = 0;i < fields.length; i ++) {
Class test = fields[i].getType();
sortedFields.put(fields[i].getName(),test);
}
}
/**
* 通过反射调用Bean的setter填充Bean,其中DataRow标签下的所有子标签
* 分别为该Bean的属性
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(curTag) {
String content = new String(ch,start,length);
if(null != preTag && !"DataRow".equals(preTag.toString())) {
try {
String methodName = getMethodName(preTag);//与该标签相对应的setter
Class attr = sortedFields.get(preTag.toString());
Method method = clazz.getMethod(methodName,attr);
method.invoke(bean, attr.getConstructor(String.class).newInstance(content == null ? "":content));
} catch (Exception e) {
System.out.println("Error by: Class(" + clazz.getName() + ") has no attribute named [" + preTag + "].");
e.printStackTrace();
}
}
}
}
/**
* 通过标签名得到setter
* @param str 标签名
* @return setter
* @throws Exception
*/
private String getMethodName(String str) {
if(str.length() == 1){
return "set" + str.toUpperCase();
}
return "set" + str.substring(0,1).toUpperCase() + str.substring(1,str.length());
}
/**
* DataRow标签的开标记代表一个对象的解析开始,通过构造器构造一个Bean,
* 置curTag标志为true
*/
@Override
public void startElement(String uri, String localName, String qName,Attributes attrs) throws SAXException {
if("DataRow".equals(qName)) {
try {
bean = clazz.getConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
curTag = true;
}
preTag = qName;
}
/**
* DataRow标签的关标记代表一个对象的解析结束,将已填充的Bean保存到List,
* 置Bean为null,置curTag标志为false,置preTag为null,跳过characters方法
*/
@Override
public void endElement(String arg0, String arg1, String qName) throws SAXException {
//解析完成一个Bean将
if("DataRow".equals(qName)) {
list.add(bean);
curTag = false;
bean = null;
}
preTag = null;
}
public List getList() {
return list;
}
}
class MyXmlReader {
/**保存已经解析的JavaBean*/
private List resultList;
/**解析对象的Class*/
private Class clazz;
/**解析对象*/
private Object bean;
/**解析对象的所有字段*/
private Field[] fields;
/**保存解析对象各个字段的Class*/
private Map<String,Class> sortedFields;
/**
* 初始化clazz和fields
* @param clazz
*/
public MyXmlReader(Class clazz) {
this.clazz = clazz;
this.fields = clazz.getDeclaredFields();
this.resultList = new ArrayList();
this.sortedFields = new HashMap<String,Class>();
for(int i = 0;i < fields.length; i ++) {
Class test = fields[i].getType();
sortedFields.put(fields[i].getName(),test);
}
}
public List parseXml(File file) throws DocumentException {
SAXReader reader = new SAXReader();
Document doc = reader.read(file);
Element root = doc.getRootElement();
List childList = root.elements();
for(int i = 0; i < childList.size(); i ++ ) {
List list = ((Element)childList.get(i)).elements();
try {
bean = clazz.getConstructor().newInstance();
} catch (Exception e1) {
e1.printStackTrace();
}
for(int j = 0; j < list.size(); j ++ ) {
Element element = (Element) list.get(j);
String eleName = element.getName();
String content = element.getText().trim();
try {
String methodName = getMethodName(eleName);//与该标签相对应的setter
Class attr = sortedFields.get(eleName);
Method method = clazz.getMethod(methodName,attr);
method.invoke(bean, attr.getConstructor(String.class).newInstance(content.equals("") ? (attr.getName().equals("java.math.BigDecimal") ? "0" : "") :content));
} catch (Exception e) {
System.out.println("Error by: Class(" + clazz.getName() + ") has no attribute named [" + eleName + "].");
e.printStackTrace();
}
}
resultList.add(bean);
}
return resultList;
}
private String getMethodName(String str) {
if(str.length() == 1){
return "set" + str.toUpperCase();
}
return "set" + str.substring(0,1).toUpperCase() + str.substring(1,str.length());
}
}
}