dom4j解析XML成对象

  最近不太忙,发现现在服务之间的交互都是通过xml进行的,所以今天理了一下xml的两种解析方式。首先是最流行的dom4j解析。先解析,然后通过反射转成对象。
用到的jar:dom4j-1.6.1.jar jaxen-1.1.1.jar
1.xml字符串转成对象:
   /** 
     * 解析XMl字符串数据,转化成对象,并返回 
     * @param xml xml字符串数据 
     * @param xpathPattern xpath的匹配模式;具体语法请查XPath的语法 
     * @param classType 要转化对象的类型 
     * @return 返回用xml数据实例化之后的对象 
     */  
 @SuppressWarnings({ "unchecked", "rawtypes" })
    public static Object parseXmlStr(String xml, String xpathPattern, Class classType)  
    {  
        try  
        {  
            Document doc = DocumentHelper.parseText(xml);  
            List nodes = doc.selectNodes(xpathPattern);  
//          Element root = doc.getRootElement();  
//          List nodes = root.selectNodes("user");
            List objs = new ArrayList();  
            for(Node node : nodes)  
            {  
                Map map = traverse(node);  
                if(classType == String.class)  
                {  
                    objs.add(map.values().toArray()[0]);  
                }  
                else  
                {  
                    objs.add(nodeToBean(map, classType));  
                }  
            }  
            return objs;  
        }  
        catch(Exception e)  
        {  
        e.printStackTrace();
            return null;  
        }  
    } 

2.解析xml文件转成对象:
/** 
     * 解析XMl文件,转化成对象,并返回 
     * @param xmlPath:xml文件路径(绝对路径) 
     * @param xpathPattern xpath的匹配模式;具体语法请查XPath的语法 
     * @param classType 要转化对象的类型 
     * @return 返回用xml数据实例化之后的对象 
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
 public static Object parseXmlFile(String xmlPath, String xpathPattern, Class classType)  
    {  
        try {
        SAXReader reader = new SAXReader();  
 Document doc = reader.read(new File(xmlPath));
 List nodes = doc.selectNodes(xpathPattern);  
            List objs = new ArrayList();  
            for(Node node : nodes)  
            {  
                Map map = traverse(node);  
                if(classType == String.class)  
                {  
                    objs.add(map.values().toArray()[0]);  
                }  
                else  
                {  
                    objs.add(nodeToBean(map, classType));  
                }  
            }  
            return objs; 
 } catch (DocumentException e) {
 e.printStackTrace();
 return null;
 } catch (Exception e) {
 e.printStackTrace();
 return null;
 } 
    }

3.用到的辅助方法:
   /** 
     * 从找出的Node节点开始,遍历所有子节点,获取子节点的数据 
     * @param node:Node节点 
     * @return 返回节点的值 
     */  
    private static Map traverse(Node node)  
    {  
        Map map = new HashMap();  
        if(node instanceof Element)  
        {  
            map = treeWalk((Element)node, map);  
        }  
        else  
        {  
            map.put(node.getName(), node.getText());  
        }  
        return map;  
    }  
      
    /** 
     * 递归法提取节点的值 
     * @param element: 节点 
     * @param map: 保存节点的值 
     */  
    private static Map treeWalk(Element element, Map map)  
    {  
    //遍历该元素自身的属性
    int as= element.attributeCount();
    for(int j=0;j map, Class classType) throws Exception
    {  
        Field[] fields = classType.getDeclaredFields();//返回该类型的所有子属性(包含他继承的类和接口的)  
 Object obj = classType.getConstructor().newInstance();//创建该类型的实例
        for(Field field : fields)  
        {  
            //属性名  
            String fieldName = field.getName();  
            if(!map.containsKey(fieldName))  
            {  
                continue;  
            }  
            //因为解析出来都是String类型的,所以创建一个String类型转换成field.getType类型的构造器
            Constructor> con = field.getType().getConstructor(String.class);//
            Object param = con.newInstance(map.get(fieldName));//通过构造器把字符串转换成field.getType类型的实例
            fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);//首字母大写
            //根据方法的命名规范,获取该属性的set方法  
            String methodName = "set" + fieldName;  
            Method method = classType.getMethod(methodName, field.getType());//获取setter方法把值set到对象实例中
            method.invoke(obj, param);  
        }  
        return obj;  
    } 

4.测试方法:
public static void main(String[] args) {
 String xml = ""+
 "123345"+
 "duansha0327duansha"+
 "zhangdaihaomima"+
 "";
 String xmlPath = "D:/testXml/user.xml";
// List us = (List) Dom4jXml.parseXmlStr(xml, "/users/user[last()]", User.class);
 List us = (List) Dom4jXml.parseXmlFile(xmlPath, "/users/user[last()]", User.class);
 if(null != us && us.size()>0)
 {
 for(User u:us)
 {
 System.out.println("Id="+u.getId()+" ;userName="+u.getUsername()+" ;passWord"+u.getPassword());
 }
 }
 else
 {
 System.out.println("解析失败...");
 }
 }

5.XPath的语法参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp

你可能感兴趣的:(java,xml,dom4j)