XML學習06-Java中Dom4J方式解析XML文件

一、什麼Dom4J方式

Dom4j是一個簡單、靈活的開放源代碼的庫,是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟件採用的Dom4j,例如Hibernate。

二、Java中使用Dom4J方式的準備工作

由於Dom4J並不是JDK中的API,需要自己到網絡上下載相應的jar包,並且在需要使用Dom4J的項目中添加。

三、具體的Java代碼實現
在java中用Dom4JAPI實現以下七種常見操作:(註釋中解釋具體操作)
0、創建解析器,得到Document對象、將修改結果輸出到源文件
1、得到某個具體的節點內容
2、遍歷所有元素節點
3、修改某個元素節點的主體內容
4、向指定元素節點中增加子元素節點
5、向指定元素節點上增加同級元素節點
6、刪除指定元素節點
7、操作XML文件屬性

待解析的XML文檔內容:

<聯繫人列表> 
  <聯繫人> 
    <姓名>張三</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>30</年齡> 
  </聯繫人>  
  <聯繫人> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>31</年齡>
  </聯繫人> 
</聯繫人列表>

0、創建解析器,得到Document對象、將修改結果輸出到源文件

//創建Dom4j解析器
SAXReader reader = new SAXReader();
//加載document對象
Document document = reader.read("src/j2ee/dom/linkman.xml");
//將結果保存到硬盤上
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"), OutputFormat.createPrettyPrint());//參數:文件輸出流(目標文件),輸出格式(有兩種,一般選用PrettyPrint格式)
writer.write(document);
writer.close();

1、得到某個具體的節點內容(獲取第二個聯繫人姓名,輸出結果爲李四)

public static void test01(Document document) {
        //拿到根節點
        Element root = document.getRootElement();
        //拿到所有的聯繫人
        List<Element> men = root.elements();
        //拿到第二個聯繫人
        Element man = men.get(1);
        //打印第二個聯繫人的姓名
        System.out.println(man.elementText("姓名"));
    }

2、遍歷所有元素節點

public static void treeWalk(Document document) {
        //從根節點開始遍歷
        treeWalk( document.getRootElement() );
    }
    public static void treeWalk(Element element) {
        for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
            //循環拿到當前節點下的每一個子節點
            Node node = element.node(i);
            //如果當前拿到的節點時一個元素,則輸出元素名,且遞歸調用遍歷方法遍歷當前元素的子節點
            if ( node instanceof Element ) {
                System.out.println(node.getName());
                treeWalk((Element) node);
            }
        }
    }

輸出結果:(將XML文檔中的元素標籤名按順序輸出)

聯繫人
姓名
EMAIL
年齡
聯繫人
姓名
EMAIL
年齡

3、修改某個元素節點的主體內容

 /**
     * 3、修改某個元素節點的主體內容 (李四年齡改爲27)
     */
public static void test03(Document document) throws IOException {
       //拿到根節點
       Element root = document.getRootElement();
       //拿到根節點下所有元素
       List<Element> men = root.elements();
       //拿到第二個聯繫人李四
       Element man = men.get(1);
       //拿到李四的年齡節點
       Element name = man.element("年齡");
       //將李四的年齡改爲27
       name.setText("27");
       //將結果保存到硬盤上
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"), OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件發現聯繫人李四的年齡變爲27

4、向指定元素節點中增加子元素節點

/**
     * 4、向指定元素節點中增加子元素節點(張三姓名內添加暱稱)
     */
    public static void test04(Document document) throws IOException {
        Element root = document.getRootElement();
        List<Element> men = root.elements();
        Element man = men.get(0);
        //拿到第一個聯繫人的姓名節點
        Element name = man.element("姓名");
        //在姓名節點內添加元素"暱稱"內容爲"三哥"
        name.addElement("暱稱").setText("三哥");
        //將結果保存到硬盤上
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件:(張三姓名下多了暱稱節點,李四年齡在3操作時被修改)

<聯繫人列表> 
  <聯繫人> 
    <姓名>張三
      <暱稱>三哥</暱稱>
    </姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>30</年齡> 
  </聯繫人>  
  <聯繫人> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>27</年齡> 
  </聯繫人> 
</聯繫人列表>

5、向指定元素節點上增加同級元素節點

 /**
     * 5、向指定元素節點上增加同級元素節點(給李四年齡節點增加同級別節點婚否)
     */
    public static void test05(Document document) throws IOException {
        Element root = document.getRootElement();
        List<Element> men = root.elements();
        Element man = men.get(1);
        //得到李四年齡節點
        Element age = man.element("年齡");
        //添加年齡節點的同級別節點"婚否",內容爲"已婚"
        age.getParent().addElement("婚否").setText("已婚");
        //將結果保存到硬盤
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件:

<聯繫人列表> 
  <聯繫人> 
    <姓名>張三 
      <暱稱>三哥</暱稱> 
    </姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>30</年齡> 
  </聯繫人>  
  <聯繫人> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>27</年齡>  
    <婚否>已婚</婚否>
  </聯繫人> 
</聯繫人列表>

6、刪除指定元素節點

 /**
     * 6、刪除指定元素節點(刪除張三暱稱)
     */
    public static void test06(Document document) throws IOException {
        Element root = document.getRootElement();
        List<Element> men = root.elements();
        Element man = men.get(0);
        Element name = man.element("姓名");
        Element nickname = name.element("暱稱");
        //刪除了name元素(姓名)的子元素nickname(暱稱)
        name.remove(nickname);

        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件:(暱稱節點已經被刪除)

<聯繫人列表> 
  <聯繫人> 
    <姓名>張三</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>30</年齡> 
  </聯繫人>  
  <聯繫人> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>27</年齡>  
    <婚否>已婚</婚否> 
  </聯繫人> 
</聯繫人列表>

7、操作XML文件屬性

/**
     * 7、操作XML文件屬性(聯繫人添加性別)
     */
    public static void test07(Document document) throws IOException {
        Element root = document.getRootElement();
        List<Element> men = root.elements();
        //遍歷所有聯繫人
        for (Element man: men) {
            //給每個聯繫人添加屬性"性別",內容爲"男"
           man.addAttribute("性別","男");
        }
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }

查看源文件:(性別屬性被添加到聯繫人標籤內)

<聯繫人列表> 
  <聯繫人 性別="男"> 
    <姓名>張三</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>30</年齡> 
  </聯繫人>  
  <聯繫人 性別="男"> 
    <姓名>李四</姓名>  
    <EMAIL>[email protected]</EMAIL>  
    <年齡>27</年齡>  
    <婚否>已婚</婚否> 
  </聯繫人> 
</聯繫人列表>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章