轉載:Java使用dom4j解析XML

原文地址:http://blog.csdn.net/yyywyr/article/details/38359049
解析XML的方式有很多,本文介紹使用dom4j解析xml。
1、環境準備
(1)下載dom4j-1.6.1.jar
(2)下載junit-4.10.jar
2、溫馨提示
解析XML過程是通過獲取Document對象,然後繼續獲取各個節點以及屬性等操作,因此獲取Document對象是第一步,大體說來,有三種方式:
(1)自己創建Document對象

Document document = DocumentHelper.createDocument();
Element root = document.addElement("students");

其中students是根節點,可以繼續添加其他節點等操作。
(2)讀取XML文件獲取Document對象

//創建SAXReader對象
SAXReader reader = new SAXReader();
//讀取文件 轉換成Document
Document document = reader.read(new File("XXXX.xml"));

(3)讀取XML文本內容獲取Document對象

String xmlStr = "<students>......</students>";
        Document document = DocumentHelper.parseText(xmlStr);

3、示例
(1)xml文件內容如下

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student1 id="001">
        <微信公衆號>@殘缺的孤獨</微信公衆號>
        <學號>20140101</學號>
        <地址>北京海淀區</地址>
        <座右銘>要麼強大,要麼聽話</座右銘>
    </student1>
    <student2 id="002">
        <新浪微博>@殘缺的孤獨</新浪微博>
        <學號>20140102</學號>
        <地址>北京朝陽區</地址>
        <座右銘>在哭泣中學會堅強</座右銘>
    </student2>
</students>

(2)解析過程

package cn.com.yy.dom4j;

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

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class Dom4JforXML {

    @Test
    public void test() throws Exception{
        //創建SAXReader對象
        SAXReader reader = new SAXReader();
        //讀取文件 轉換成Document
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
        //獲取根節點元素對象
        Element root = document.getRootElement();
        //遍歷
        listNodes(root);
    }

    //遍歷當前節點下的所有節點
    public void listNodes(Element node){
        System.out.println("當前節點的名稱:" + node.getName());
        //首先獲取當前節點的所有屬性節點
        List<Attribute> list = node.attributes();
        //遍歷屬性節點
        for(Attribute attribute : list){
            System.out.println("屬性"+attribute.getName() +":" + attribute.getValue());
        }
        //如果當前節點內容不爲空,則輸出
        if(!(node.getTextTrim().equals(""))){
             System.out.println( node.getName() + ":" + node.getText());  
        }
        //同時迭代當前節點下面的所有子節點
        //使用遞歸
        Iterator<Element> iterator = node.elementIterator();
        while(iterator.hasNext()){
            Element e = iterator.next();
            listNodes(e);
        }
    }
}

(3)解析結果

當前節點的名稱:students
當前節點的名稱:student1
屬性id:001
當前節點的名稱:微信公衆號
微信公衆號:@殘缺的孤獨
當前節點的名稱:學號
學號:20140101
當前節點的名稱:地址
地址:北京海淀區
當前節點的名稱:座右銘
座右銘:要麼強大,要麼聽話
當前節點的名稱:student2
屬性id:002
當前節點的名稱:新浪微博
新浪微博:@殘缺的孤獨
當前節點的名稱:學號
學號:20140102
當前節點的名稱:地址
地址:北京朝陽區
當前節點的名稱:座右銘
座右銘:在哭泣中學會堅強

4、dom4j操作節點屬性
使用dom4j可以操作節點屬性,比如添加節點屬性、刪除節點屬性、修改屬性值等操作。下面使用dom4j爲上述的student1節點刪除id屬性,新添name屬性。
(1)代碼示例

@Test
    public void test2()throws Exception{
        //創建SAXReader對象
        SAXReader reader = new SAXReader();
        //讀取文件 轉換成Document
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
        //獲取根節點元素對象
        Element root = document.getRootElement();

        System.out.println("-------添加屬性前------");
        //獲取節點student1
        Element student1Element = root.element("student1");
        //遍歷
        listNodes(student1Element);
        //獲取其屬性
        Attribute idAttribute = student1Element.attribute("id");
        //刪除其屬性
        student1Element.remove(idAttribute);
        //爲其添加新屬性
        student1Element.addAttribute("name", "這是student1節點的新屬性");
        System.out.println("-------添加屬性後------");
        listNodes(student1Element);
    }

(2)結果

-------添加屬性前------
當前節點的名稱:student1
<span style="background-color: rgb(255, 0, 0);">屬性id:001</span>
當前節點的名稱:微信公衆號
微信公衆號:@殘缺的孤獨
當前節點的名稱:學號
學號:20140101
當前節點的名稱:地址
地址:北京海淀區
當前節點的名稱:座右銘
座右銘:要麼強大,要麼聽話
-------添加屬性後------
當前節點的名稱:student1
<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">屬性name:這是student1節點的新屬性
</span></span>當前節點的名稱:微信公衆號
微信公衆號:@殘缺的孤獨
當前節點的名稱:學號
學號:20140101
當前節點的名稱:地址
地址:北京海淀區
當前節點的名稱:座右銘
座右銘:要麼強大,要麼聽話

5、dom4j新增節點
使用dom4j可以刪除指定節點、新增節點等操作,我們使用dom4j爲student1節點新增phone節點,如下。
(1)代碼

//添加節點
    @Test
    public void test3()throws Exception{
        //創建SAXReader對象
        SAXReader reader = new SAXReader();
        //讀取文件 轉換成Document
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
        //獲取根節點元素對象
        Element root = document.getRootElement();
        System.out.println("-------添加節點前------");
        //獲取節點student1
        Element student1Element = root.element("student1");
        //遍歷
        listNodes(student1Element);
        //添加phone節點
        Element phoneElement = student1Element.addElement("phone");
        //爲phone節點設置值
        phoneElement.setText("137xxxxxxxx");
        System.out.println("-------添加節點後------");
        listNodes(student1Element);
    }

(2)結果

-------添加節點前------
當前節點的名稱:student1
屬性id:001
當前節點的名稱:微信公衆號
微信公衆號:@殘缺的孤獨
當前節點的名稱:學號
學號:20140101
當前節點的名稱:地址
地址:北京海淀區
當前節點的名稱:座右銘
座右銘:要麼強大,要麼聽話
-------添加節點後------
當前節點的名稱:student1
屬性id:001
當前節點的名稱:微信公衆號
微信公衆號:@殘缺的孤獨
當前節點的名稱:學號
學號:20140101
當前節點的名稱:地址
地址:北京海淀區
當前節點的名稱:座右銘
座右銘:要麼強大,要麼聽話
當前節點的名稱:phone
<span style="color:#ff0000;">phone:137xxxxxxxx</span>

6、把Document對象寫入新的文件
有時,我們需要把document對象寫入新的文件,dom4j提供了對應的API以便我們進行操作。我們在完成第 5 後,把document寫入新的文件s1.xml,如下。
(1)代碼

//添加節點後,寫入新的文件
    @Test
    public void test4()throws Exception{
        //創建SAXReader對象
        SAXReader reader = new SAXReader();
        //讀取文件 轉換成Document
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
        //獲取根節點元素對象
        Element root = document.getRootElement();
        System.out.println("-------添加節點前------");
        //獲取節點student1
        Element student1Element = root.element("student1");
        //遍歷
        listNodes(student1Element);
        //添加phone節點
        Element phoneElement = student1Element.addElement("phone");
        //爲phone節點設置值
        phoneElement.setText("137xxxxxxxx");
        System.out.println("-------添加節點後------");
        listNodes(student1Element);
        //把student1Element寫入新文件
        writerDocumentToNewFile(document);
        System.out.println("---寫入完畢----");
    }

    //document寫入新的文件
    public void writerDocumentToNewFile(Document document)throws Exception{
        //輸出格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        //設置編碼
        format.setEncoding("UTF-8");
        //XMLWriter 指定輸出文件以及格式
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);

        //寫入新文件
        writer.write(document);
        writer.flush();
        writer.close();
    }

(2)查看s1.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<students> 
  <student1 id="001"> 
    <微信公衆號>@殘缺的孤獨</微信公衆號>  
    <學號>20140101</學號>  
    <地址>北京海淀區</地址>  
    <座右銘>要麼強大,要麼聽話</座右銘>  
    <phone>137xxxxxxxx</phone>
  </student1>  
  <student2 id="002"> 
    <新浪微博>@殘缺的孤獨</新浪微博>  
    <學號>20140102</學號>  
    <地址>北京朝陽區</地址>  
    <座右銘>在哭泣中學會堅強</座右銘> 
  </student2> 
</students>

因爲涉及到中文,所以在輸出時要設定UTF8編碼,OutputStreamWriter進行設置編碼。
還有輸出格式的問題,在此處使用的是OutputFormat.createPrettyPrint(),輸出文檔時進行了排版格式化。還有一種是OutputFormat.createCompactFormat()方法,輸出內容是一行,沒有進行格式化,是緊湊型的輸出。如下:

<?xml version="1.0" encoding="UTF-8"?>
<students><student1 id="001"><微信公衆號>@殘缺的孤獨</微信公衆號><學號>20140101</學號><地址>北京海淀區</地址><座右銘>要麼強大,要麼聽話</座右銘><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@殘缺的孤獨</新浪微博><學號>20140102</學號><地址>北京朝陽區</地址><座右銘>在哭泣中學會堅強</座右銘></student2></students>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章