XML—XML解析之DOM4J

黄舟
發布: 2017-02-24 15:14:51
原創
1511 人瀏覽過


首先為什麼會有Dom4j呢?

因為DOM太耗內存,而SAX只能對XML進行讀取,而不能去添加、刪除等。所以出現了Dom4j,它的效率更高,同時也可以進行crud操作。

1.DOM4J介紹

  • #Dom4j是一個簡單、靈活地開放原始碼的函式庫。 Dom4j是由早期開發JDOM的人分離出來而後獨立開發的。與JDOM不同的是,dom4j使用介面和抽象基類,雖然Dom4j的API相對要複雜一些,但它提供了比JDOM更好的靈活性。

  • Dom4j是一個非常優秀的Java XML API,具有效能優異、功能強大且極易使用的特性。現在很多軟體採用的Dom4j,例如Hibernate,包括Sun公司自己的JAXP也用了Dom4j。

  • 使用Dom4j開發,需下載dom4j對應的jar文件,並匯入到專案。下載地址dom4j下載

2.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操作。

1.DOM4J介紹

  • #Dom4j是一個簡單、靈活地開放原始碼的函式庫。 Dom4j是由早期開發JDOM的人分離出來而後獨立開發的。與JDOM不同的是,dom4j使用介面和抽象基類,雖然Dom4j的API相對要複雜一些,但它提供了比JDOM更好的靈活性。

  • Dom4j是一個非常優秀的Java XML API,具有效能優異、功能強大和極易使用的特點。現在很多軟體採用的Dom4j,例如Hibernate,包括Sun公司自己的JAXP也用了Dom4j。

  • 使用Dom4j開發,需下載dom4j對應的jar文件,並匯入到專案。下載地址dom4j下載

2.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)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!