private static <T> T XML2Bean(String ecinfo,Class<T> t) throws DocumentException, InstantiationException, IllegalAccessException {
Preconditions.checkArgument(!Strings.isNullOrEmpty(ecinfo)); //google guava api,可以去掉,只是個前置驗證
SAXReader saxReader = new SAXReader(); //dom4j api
Document document = saxReader.read(new StringReader(ecinfo));
List<Element> list = document.selectNodes("//*");//獲得所有節點
T cinfo = t.newInstance();
for(Element node: list){
System.out.println(node.getName());
fillBean(cinfo,node); //這個api弄得不是太美,可以這樣的其實 fillBean(Class<T> t,Node),現在不改了,也可以用的
}
// System.out.println(document.asXML());
return cinfo;
}
private static <T> void fillBean(T t, Node node){
try {
Class<T> eci = (Class<T>) t.getClass();
Method[] methods = eci.getMethods();
for(Method method :methods){
if(method.getName().startsWith("set")){
String methodname = method.getName().substring(3);
if(methodname.equalsIgnoreCase(node.getName())){
method.invoke(t, node.getStringValue()==null?"":node.getStringValue().trim());
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
此段代碼:要求,xml所有終端節點的tag name要和bean中一直,大小寫無所謂。當然,這還有個問題,就是其實現在還是有個問題,要手動寫個java bean,其實javabean 完全可以根據dom生成一個,這個工具也比較好開發,只是我做的時候沒有開發,下一次再有此業務,在開發個吧