一、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建立不細講,很多時候都是根據業務來的。