dom4j 分 dom解析 和 sax 两种解析 xml的 方式:
1 dom 解析:
将xml 下的指定节点 转换成map
public static List<Map<String, String>> xmlToList(String documentXml,String nodeString) throws DocumentException{
Document d = DocumentHelper.parseText(documentXml);
/**Node 中的 valueOf(xpath) 和 selectSingleNode(xpath)的中的方法直接获得节点值
System.out.println(d.valueOf("//head/code").trim());
String ss = d.selectSingleNode("//message").getText();*/
//document 没有自己的查元素的方法
//element 有 xml-map
List<Node> list = d.selectNodes("//"+nodeString);
List<Map<String, String>> listReturn = new ArrayList<Map<String, String>>();
for(Node node : list){
Element e = (Element)node;
Iterator<?> it = e.elementIterator();
Map<String,String> map = new HashMap<String,String>();
while(it.hasNext()){
Element ee = (Element)it.next();
map.put(ee.getQualifiedName(), ee.getText());/**节点标签名称、节点标签值*/
}
listReturn.add(map);
}
return listReturn;
}
接收的时候 如何将map 直接映射成业务bean?
public static List<Object> mapToBean(List<Map<?,?>> list,Object obj) throws Exception {
List<Object> listR = new ArrayList<Object>();
try{
Method[] methods = obj.getClass().getMethods();/**获得类对象的方法*/
for(Map<?, ?> map : list){
Object objNew = obj.getClass().newInstance();/**每次生成一个新的传入对象*/
for(Method method : methods){
String methodName = method.getName();
if(methodName.startsWith("set")){/**对set方法操作*/
String key = methodName.substring(3).toLowerCase();/**截取set方法后的字符作为属性*/
String value = (String)map.get(key);
method.invoke(objNew, value);/**给新对象的该方法通过反射赋值*/
}
}
listR.add(objNew);
}
}catch(Exception e ){
throw new Exception("map 反射 bean 异常!");
}
return listR;
}