XML解析与Map、Json、Bean转换,Dom4j-工具类


对于开发人员来说,xml文件的处理应该并不陌生吧,先总述下,个人感觉XStream在处理XML文件和JavaBean对象互转时比较好,dom4j对常用的xml配置文件操作比较好点;首先,Dom4j 处理xml应该是公认的易操作、高效率,特别是对读取和修改xml文件中内容 也提供了丰富的API接口,但是在dom4j在处理XML文件和JavaBean对象互转时,会有些小麻烦,特别是 XML 文件的内容转换成对应的 JavaBean对象的情况,这时 XStream 就显得的得心应手了,除此之外,XStream还可以实现对JSon格式的完美转换,XStream比较小巧,但功能有限,不过大众型的日常操作基本够用;总的来说,如果涉及到XML文件和其它对象的转换 可以考虑下用XStream,其它情况下建议用Dom4j。

Stream官网下载地址:http://xstream.codehaus.org/download.html

Dom4j官网地址:http://www.dom4j.org/download.html

另外,XStream和Dom4j的详细区别,可以阅读下: http://blog.csdn.net/thunder09/article/details/5555946


1、使用Dom4j解析XML

        dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的JavaXML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它.

       对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如hibernate,包括sun公司自己的JAXM也用了Dom4j。

       使用Dom4j开发,需下载dom4j相应的jar文件

         dom4j-1.6.1.jar

         junit-4.10.jar

一、DOM4j中,获得Document对象的方式有三种:

  • 1.读取XML文件,获得document对象              

  •    SAXReader reader = new SAXReader();                 

  •    Document   document = reader.read(new File("csdn.xml"));  

  • 2.解析XML形式的文本,得到document对象.  

  •    String text = "<csdn></csdn>";               

  •    Document document = DocumentHelper.parseText(text);  

  • 3.主动创建document对象.  

  •    Document document = DocumentHelper.createDocument();       //创建根节点  

  •    Element root = document.addElement("csdn");


示例

(1)xml文件内容如下

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <students>  
  3.     <student1 id="001">  
  4.         <微信公众号>@残缺的孤独</微信公众号>  
  5.         <学号>20140101</学号>  
  6.         <地址>北京海淀区</地址>  
  7.         <座右铭>要么强大,要么听话</座右铭>  
  8.     </student1>  
  9.     <student2 id="002">  
  10.         <新浪微博>@残缺的孤独</新浪微博>  
  11.         <学号>20140102</学号>  
  12.         <地址>北京朝阳区</地址>  
  13.         <座右铭>在哭泣中学会坚强</座右铭>  
  14.     </student2>  
  15. </students> 
(2)解析过程
  1. package cn.com.yy.dom4j;  
  2.   
  3. import java.io.File;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6.   
  7. import org.dom4j.Attribute;  
  8. import org.dom4j.Document;  
  9. import org.dom4j.Element;  
  10. import org.dom4j.io.SAXReader;  
  11. import org.junit.Test;  
  12.   
  13. public class Dom4JforXML {  
  14.       
  15.     @Test  
  16.     public void test() throws Exception{  
  17.         //创建SAXReader对象  
  18.         SAXReader reader = new SAXReader();  
  19.         //读取文件 转换成Document  
  20.         Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
  21.         //获取根节点元素对象  
  22.         Element root = document.getRootElement();  
  23.         //遍历  
  24.         listNodes(root);  
  25.     }  
  26.       
  27.     //遍历当前节点下的所有节点  
  28.     public void listNodes(Element node){  
  29.         System.out.println("当前节点的名称:" + node.getName());  
  30.         //首先获取当前节点的所有属性节点  
  31.         List<Attribute> list = node.attributes();  
  32.         //遍历属性节点  
  33.         for(Attribute attribute : list){  
  34.             System.out.println("属性"+attribute.getName() +":" + attribute.getValue());  
  35.         }  
  36.         //如果当前节点内容不为空,则输出  
  37.         if(!(node.getTextTrim().equals(""))){  
  38.              System.out.println( node.getName() + ":" + node.getText());    
  39.         }  
  40.         //同时迭代当前节点下面的所有子节点  
  41.         //使用递归  
  42.         Iterator<Element> iterator = node.elementIterator();  
  43.         while(iterator.hasNext()){  
  44.             Element e = iterator.next();  
  45.             listNodes(e);  
  46.         }  
  47.     }  
  48. }  
(3)解析结果
  1. 当前节点的名称:students  
  2. 当前节点的名称:student1  
  3. 属性id:001  
  4. 当前节点的名称:微信公众号  
  5. 微信公众号:@残缺的孤独  
  6. 当前节点的名称:学号  
  7. 学号:20140101  
  8. 当前节点的名称:地址  
  9. 地址:北京海淀区  
  10. 当前节点的名称:座右铭  
  11. 座右铭:要么强大,要么听话  
  12. 当前节点的名称:student2  
  13. 属性id:002  
  14. 当前节点的名称:新浪微博  
  15. 新浪微博:@残缺的孤独  
  16. 当前节点的名称:学号  
  17. 学号:20140102  
  18. 当前节点的名称:地址  
  19. 地址:北京朝阳区  
  20. 当前节点的名称:座右铭  
  21. 座右铭:在哭泣中学会坚强 
(4)节点对象操作的方法

  1. 1.获取文档的根节点.  
  2.       Element root = document.getRootElement();  
  3.     2.取得某个节点的子节点.  
  4.       Element element=node.element(“四大名著");  
  5.     3.取得节点的文字  
  6.         String text=node.getText();  
  7.     4.取得某节点下所有名为“csdn”的子节点,并进行遍历.   
  8.        List nodes = rootElm.elements("csdn");    
  9.          for (Iterator it = nodes.iterator(); it.hasNext();) {      
  10.       Element elm = (Element) it.next();     
  11.     // do something  
  12.  }  
  13.      5.对某节点下的所有子节点进行遍历.       
  14.       for(Iterator it=root.elementIterator();it.hasNext();){         
  15.         Element element = (Element) it.next();         
  16.        // do something    
  17.  }  
  18.     6.在某节点下添加子节点  
  19.        Element elm = newElm.addElement("朝代");  
  20.     7.设置节点文字.   elm.setText("明朝");  
  21.     8.删除某节点.  parentElement.remove(childElment);  //childElement是待删除的节点,parentElement是其父节点
  22.     9.添加一个CDATA节点. Element contentElm = infoElm.addElement("content"); contentElm.addCDATA(“cdata区域”);  

(5)节点对象的属性方法操作
  1. 1.取得某节点下的某属性     Element root=document.getRootElement();         //属性名name  
  2.          Attribute attribute=root.attribute("id");  
  3.     2.取得属性的文字  
  4.     String text=attribute.getText();  
  5.     3.删除某属性  Attribute attribute=root.attribute("size");  root.remove(attribute);  
  6.     4.遍历某节点的所有属性      
  7.       Element root=document.getRootElement();         
  8.        for(Iterator it=root.attributeIterator();it.hasNext();){           
  9.            Attribute attribute = (Attribute) it.next();            
  10.            String text=attribute.getText();           
  11.            System.out.println(text);     
  12.   }  
  13.     5.设置某节点的属性和文字.    newMemberElm.addAttribute("name""sitinspring");  
  14.     6.设置属性的文字    Attribute attribute=root.attribute("name");    attribute.setText("csdn");


/**
 *XML解析与Map、Json、Bean转换
 */  
public class XmlConverUtil {  
     // map to xml
    public static String maptoXml(Map map) {  
        Document document = DocumentHelper.createDocument();  
        Element nodeElement = document.addElement("node");  
        for (Object obj : map.keySet()) {  
            Element keyElement = nodeElement.addElement("key");  
            keyElement.addAttribute("label", String.valueOf(obj));  
            keyElement.setText(String.valueOf(map.get(obj)));  
        }  
        return doc2String(document);  
    }  
 
      // list to xml
    public static String listtoXml(List list) throws Exception {  
        Document document = DocumentHelper.createDocument();  
        Element nodesElement = document.addElement("nodes");  
        int i = 0;  
        for (Object o : list) {  
            Element nodeElement = nodesElement.addElement("node");  
            if (o instanceof Map) {  
                for (Object obj : ((Map) o).keySet()) {  
                    Element keyElement = nodeElement.addElement("key");  
                    keyElement.addAttribute("label", String.valueOf(obj));  
                    keyElement.setText(String.valueOf(((Map) o).get(obj)));  
                }  
            } else {  
                Element keyElement = nodeElement.addElement("key");  
                keyElement.addAttribute("label", String.valueOf(i));  
                keyElement.setText(String.valueOf(o));  
            }  
            i++;  
        }  
        return doc2String(document);  
    }  
 
     // json to xml
    public static String jsontoXml(String json) {  
        try {  
            XMLSerializer serializer = new XMLSerializer();  
            JSON jsonObject = JSONSerializer.toJSON(json);  
            return serializer.write(jsonObject);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
 
    // xml to map
    public static Map xmltoMap(String xml) {  
        try {  
            Map map = new HashMap();  
            Document document = DocumentHelper.parseText(xml);  
            Element nodeElement = document.getRootElement();  
            List node = nodeElement.elements();  
            for (Iterator it = node.iterator(); it.hasNext();) {  
                Element elm = (Element) it.next();  
                map.put(elm.attributeValue("label"), elm.getText());  
                elm = null;  
            }  
            node = null;  
            nodeElement = null;  
            document = null;  
            return map;  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
 
    //xml to list
    public static List xmltoList(String xml) {  
        try {  
            List<Map> list = new ArrayList<Map>();  
            Document document = DocumentHelper.parseText(xml);  
            Element nodesElement = document.getRootElement();  
            List nodes = nodesElement.elements();  
            for (Iterator its = nodes.iterator(); its.hasNext();) {  
                Element nodeElement = (Element) its.next();  
                Map map = xmltoMap(nodeElement.asXML());  
                list.add(map);  
                map = null;  
            }  
            nodes = null;  
            nodesElement = null;  
            document = null;  
            return list;  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
 
     // xml to json
    public static String xmltoJson(String xml) {  
        XMLSerializer xmlSerializer = new XMLSerializer();  
        return xmlSerializer.read(xml).toString();  
    }  
 
    // Document to xml
    public static String doc2String(Document document) {  
        String s = "";  
        try {  
            //
            ByteArrayOutputStream out = new ByteArrayOutputStream();  
            //
            OutputFormat format = new OutputFormat(" ", true, "UTF-8");  
            XMLWriter writer = new XMLWriter(out, format);  
            writer.write(document);  
            s = out.toString("UTF-8");  
            out.close();
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
        return s;  
    }  
    
    public static void main(String[] args){
        Map map=new HashMap();
        map.put("aa", "aa0001");
        map.put("bb", "bb0002");
        String msg=XmlConverUtil.maptoXml(map);
        System.out.println(msg);
    }




GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐