天天看點

Java之dom4j的簡單解析和生成xml的應用

  一、dom4j是一個Java的XML API,是jdom的更新品,用來讀寫XML檔案的。dom4j是一個十分優秀的 Java

XML API,具有性能優異、功能強大和極其易使用的特點,它的性能超過sun公司官方的dom技術,同時它也是一個開放源代碼的軟體,可以在SourceForge上找到它。在IBM developerWorks上面還可以找到一篇文章,對主流的Java XML API進行的性能、功能和易用性的評測,是以可以知道dom4j無論在哪個方面都是非常出色的。如今可以看到越來越多的Java軟體都在使用dom4j來讀寫XML,特别值得一提的是連Sun的JAXM也在用dom4j。這已經是必須使用的jar包, Hibernate也用它來讀寫配置檔案。

  二、dom4j的xml解析過程

  1)加入依賴包

<dependency>
      <groupId>org.dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>2.1.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.2</version>
    </dependency>      

  說明:gson的目的是用來将資料轉成json的形式

  2)xml模闆

<root>
    <test1>test1</test1>
    <test1>test11</test1>
    <test2>
        <test3>test3</test3>
        <test4>test4</test4>
    </test2>
    <test2>
        <test3>test5</test3>
        <test4>test6</test4>
    </test2>
</root>      

  3)解析

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;import java.util.List;

public class Dom4jUtil {

    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("d:\\1.xml"));
        Element root = document.getRootElement();
        JsonObject jsonObject = readXml(root);
        JsonObject jsonObjectRepetition = readXmlRepetition(root);
        Gson gson = new Gson();
        System.out.println(gson.toJson(jsonObject));
        System.out.println(gson.toJson(jsonObjectRepetition));
    }

    /**
     * 處理存在重複的标簽資料(弊端,所有資料都是數組的方式存在,對xml的設計有要求,不然資料不好處理)
     * @param root
     * @return
     */
    public static JsonObject readXmlRepetition(Element root) {
        //擷取節點下面的所有元素
        List<Element> elements = root.elements();
        //如果存在則處理資料或者直接傳回節點資料
        if (elements != null && elements.size() > 0) {
            //聲明一個json資料
            JsonObject jsonObject = new JsonObject();
            //聲明一個json數組
            JsonArray mList = new JsonArray();
            //周遊所有元素
            for (Element element:elements) {
                //讀取節點資料直到節點下面沒有其他元素
                JsonObject jo = readXml(element);
                mList.add(jo);
            }
            //加入json
            jsonObject.add(root.getName(), mList);
            return jsonObject;
        } else {
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty(root.getName(), root.getText());
            return jsonObject;
        }
    }


    /**
     * 處理普通xml格式資料,不存在重複的标簽(弊端,不能處理統一标簽下的重複标簽)
     * @param root
     * @return
     */
    public static JsonObject readXml(Element root) {
        //擷取節點下面的所有元素
        List<Element> elements = root.elements();
        //如果存在則處理資料或者直接傳回節點資料
        if (elements != null && elements.size() > 0) {
            //聲明一個json資料
            JsonObject map = new JsonObject();
            //這個是處理所有下面的資料儲存在一個json中
            JsonObject jo = new JsonObject();
            for (Element element:elements) {
                JsonObject m = readXml(element);
                jo.add(element.getName(), m.get(element.getName()));
            }
            map.add(root.getName(), jo);
            return map;
        } else {
            JsonObject map = new JsonObject();
            map.addProperty(root.getName(), root.getText());
            return map;
        }
    }

}      

  4)測試結果展示

{"root":{"test1":"test11","test2":{"test3":"test5","test4":"test6"}}}
{"root":[{"test1":"test1"},{"test1":"test11"},{"test2":{"test3":"test3","test4":"test4"}},{"test2":{"test3":"test5","test4":"test6"}}]}      

  三、重點說明一下

  1)上面寫出來的工具,基本上都是用來處理特定資料的工具

  2)方法的實作上面還可以完善,但是我一直沒有找到好的資料表現形式是以寫了兩個方法

  3)可以參考這種做法,進一步做深度解析

  四、xml的建立

public static void main(String[] args) throws Exception {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("root");
        Element test1 = root.addElement("test1");
        test1.addText("test1");
        Element test2 = root.addElement("test2");
        test2.addText("test2");
        OutputStream outputStream = new FileOutputStream("d:\\2.xml");
        XMLWriter xmlWriter = new XMLWriter(outputStream);
        xmlWriter.write(document);
        xmlWriter.close();
    }      

  備注:這裡xml建立不細講,很多時候都是根據業務來的。