首先為什麼會有Dom4j呢?
因為DOM太耗內存,而SAX只能對XML進行讀取,而不能去添加、刪除等。所以出現了Dom4j,它的效率更高,同時也可以進行crud操作。
#Dom4j是一個簡單、靈活地開放原始碼的函式庫。 Dom4j是由早期開發JDOM的人分離出來而後獨立開發的。與JDOM不同的是,dom4j使用介面和抽象基類,雖然Dom4j的API相對要複雜一些,但它提供了比JDOM更好的靈活性。
Dom4j是一個非常優秀的Java XML API,具有效能優異、功能強大且極易使用的特性。現在很多軟體採用的Dom4j,例如Hibernate,包括Sun公司自己的JAXP也用了Dom4j。
使用Dom4j開發,需下載dom4j對應的jar文件,並匯入到專案。下載地址dom4j下載
依然使用我們先前的XML檔:
<?xml version="1.0" encoding="utf-8" standalone="no"?><班级> <学生 地址="香港"> <名字>周小星</名字> <年龄>23</年龄> <介绍>学习刻苦</介绍> </学生> <学生 地址="澳门"> <名字>林晓</名字> <年龄>25</年龄> <介绍>是一个好学生</介绍> </学生></班级>
該文件放在com.dom4j.test
套件中。
使用DOM4J也要取得代表整個文件Document
對象,不過這個Document對像是org.dom4j
套件中的。
在主方法中取得Document物件如下:
// 1.得到一个解析器SAXReader saxReader = new SAXReader(); // 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));
然後我們就可以根據需求來寫對應的方法,在主方法中呼叫。
【1】指定讀取某個元素(讀取第一個學生的資訊)
public static void read(Document document) { // 得到根元素 Element root = document.getRootElement(); // root.elements("学生"):表示取出root下的所有学生元素 // root.element("学生"):表示取出root下的第一个学生元素 Element student = root.element("学生"); // 取出属性 String address = student.attributeValue("地址"); // 取出各个子节点的值 String name = student.element("名字").getText(); String age = student.element("年龄").getText(); String intro = student.element("介绍").getText(); System.out.println(address); System.out.println(name); System.out.println(age); System.out.println(intro); }
【2】新增元素:新增一個學生資訊到XML文件中
public static void add(Document document) throws Exception { // 首先我们来创建一个学生节点对象 Element student = DocumentHelper.createElement("学生"); Element name = DocumentHelper.createElement("名字"); name.setText("小强"); Element age = DocumentHelper.createElement("年龄"); age.setText("22"); Element intro = DocumentHelper.createElement("介绍"); intro.setText("是一个三好学生"); // 把三个子元素加到student节点下 student.add(name); student.add(age); student.add(intro); // 为学生添加属性 student.addAttribute("地址", "大理"); // 将学生节点添加到根节点下 document.getRootElement().add(student); // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat OutputFormat output = OutputFormat.createPrettyPrint(); // 设置输出的编码为utf-8 output.setEncoding("utf-8"); // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码 XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output); xmlWriter.write(document); xmlWriter.close(); }
將學生新增到XML文件中,也需要在最後將記憶體中的Document物件寫入對應的文件,不然所有的動作只是在記憶體中進行,並不會輸出到文件中,這與DOM類似。
我們依然可以將這段更新的程式碼單獨寫成一個方法,如下:
public static void update(Document document) throws Exception { // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat OutputFormat output = OutputFormat.createPrettyPrint(); // 设置输出的编码为utf-8 output.setEncoding("utf-8"); XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output); xmlWriter.write(document); xmlWriter.close(); }
#【3】新增一個元素到指定位置
public static void addByIndex(Document document) throws Exception { // 创建一个元素 Element newStu = DocumentHelper.createElement("学生"); newStu.setText("王小明"); // 得到所有学生的list List allStudent = document.getRootElement().elements("学生"); allStudent.add(1, newStu); update(document); }
這裡其實是直接在得到的List
中添加,然後更新即可。這裡的List
就是java.util
套件中的List
#【4】刪除一個元素或刪除這個元素的屬性
刪除一個元素與DOM類似,都是透過對應的父節點刪除該節點。比方說我們要刪除第一個學生節點:
public static void delete(Document document) throws Exception { // 找到该元素 Element student = document.getRootElement().element("学生"); // 删除元素的某个属性 student.remove(student.attribute("地址")); // 通过父节点删除节点 student.getParent().remove(student); update(document); }
【5】更新元素
例如我們要把所有學生的年齡加1,並且將所有學生的地址屬性改為美國:
public static void updateAgeAndAddress(Document document) throws Exception { Element root = document.getRootElement(); List<Element> list = root.elements(); for (Element element : list) { // 更新属性 element.addAttribute("地址", "美国"); // 更新年龄子节点的值 Element e_age = element.element("年龄"); int age = Integer.parseInt(e_age.getTextTrim()); e_age.setText(String.valueOf(age + 1)); } update(document); }
首先為什麼會有Dom4j呢?
因為DOM太耗內存,而SAX只能對XML進行讀取,而不能去新增、刪除等。所以出現了Dom4j,它的效率更高,同時也可以進行crud操作。
#Dom4j是一個簡單、靈活地開放原始碼的函式庫。 Dom4j是由早期開發JDOM的人分離出來而後獨立開發的。與JDOM不同的是,dom4j使用介面和抽象基類,雖然Dom4j的API相對要複雜一些,但它提供了比JDOM更好的靈活性。
Dom4j是一個非常優秀的Java XML API,具有效能優異、功能強大和極易使用的特點。現在很多軟體採用的Dom4j,例如Hibernate,包括Sun公司自己的JAXP也用了Dom4j。
使用Dom4j開發,需下載dom4j對應的jar文件,並匯入到專案。下載地址dom4j下載
依然使用我們先前的XML檔:
<?xml version="1.0" encoding="utf-8" standalone="no"?><班级> <学生 地址="香港"> <名字>周小星</名字> <年龄>23</年龄> <介绍>学习刻苦</介绍> </学生> <学生 地址="澳门"> <名字>林晓</名字> <年龄>25</年龄> <介绍>是一个好学生</介绍> </学生></班级>
該文件放在com.dom4j.test
套件中。
使用DOM4J也要取得代表整個文件Document
對象,不過這個Document對像是org.dom4j
套件中的。
在主方法中取得Document物件如下:
// 1.得到一个解析器SAXReader saxReader = new SAXReader(); // 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));
然後我們就可以根據需求來寫對應的方法,在主方法中呼叫。
【1】指定讀取某個元素(讀取第一個學生的資訊)
public static void read(Document document) { // 得到根元素 Element root = document.getRootElement(); // root.elements("学生"):表示取出root下的所有学生元素 // root.element("学生"):表示取出root下的第一个学生元素 Element student = root.element("学生"); // 取出属性 String address = student.attributeValue("地址"); // 取出各个子节点的值 String name = student.element("名字").getText(); String age = student.element("年龄").getText(); String intro = student.element("介绍").getText(); System.out.println(address); System.out.println(name); System.out.println(age); System.out.println(intro); }
【2】新增元素:新增一個學生資訊到XML文件中
public static void add(Document document) throws Exception { // 首先我们来创建一个学生节点对象 Element student = DocumentHelper.createElement("学生"); Element name = DocumentHelper.createElement("名字"); name.setText("小强"); Element age = DocumentHelper.createElement("年龄"); age.setText("22"); Element intro = DocumentHelper.createElement("介绍"); intro.setText("是一个三好学生"); // 把三个子元素加到student节点下 student.add(name); student.add(age); student.add(intro); // 为学生添加属性 student.addAttribute("地址", "大理"); // 将学生节点添加到根节点下 document.getRootElement().add(student); // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat OutputFormat output = OutputFormat.createPrettyPrint(); // 设置输出的编码为utf-8 output.setEncoding("utf-8"); // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码 XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output); xmlWriter.write(document); xmlWriter.close(); }
將學生新增到XML文件中,也需要在最後將記憶體中的Document物件寫入對應的文件,不然所有的動作只是在記憶體中進行,並不會輸出到文件中,這與DOM類似。
我們依然可以將這段更新的程式碼單獨寫成一個方法,如下:
public static void update(Document document) throws Exception { // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat OutputFormat output = OutputFormat.createPrettyPrint(); // 设置输出的编码为utf-8 output.setEncoding("utf-8"); XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output); xmlWriter.write(document); xmlWriter.close(); }
#【3】新增一個元素到指定位置
public static void addByIndex(Document document) throws Exception { // 创建一个元素 Element newStu = DocumentHelper.createElement("学生"); newStu.setText("王小明"); // 得到所有学生的list List allStudent = document.getRootElement().elements("学生"); allStudent.add(1, newStu); update(document); }
這裡其實是直接在得到的List
中添加,然後更新即可。這裡的List
就是java.util
套件中的List
#【4】刪除一個元素或刪除這個元素的屬性
刪除一個元素與DOM類似,都是透過對應的父節點刪除該節點。比方說我們要刪除第一個學生節點:
public static void delete(Document document) throws Exception { // 找到该元素 Element student = document.getRootElement().element("学生"); // 删除元素的某个属性 student.remove(student.attribute("地址")); // 通过父节点删除节点 student.getParent().remove(student); update(document); }
【5】更新元素
例如我們要把所有學生的年齡加1,並且將所有學生的地址屬性改為美國:
public static void updateAgeAndAddress(Document document) throws Exception { Element root = document.getRootElement(); List<Element> list = root.elements(); for (Element element : list) { // 更新属性 element.addAttribute("地址", "美国"); // 更新年龄子节点的值 Element e_age = element.element("年龄"); int age = Integer.parseInt(e_age.getTextTrim()); e_age.setText(String.valueOf(age + 1)); } update(document); }
以上就是XML—XML解析之DOM4J的内容,更多相关内容请关注PHP中文网(www.php.cn)!