如何用DOM4J解析XML


認識XML

  XML是Extensible Markup Language 即可擴展標記語言的縮寫,是一種簡單的數據儲存語言,使用一系列簡單的標記來描述數據

        <element_name attribute_name="value" .../>        // 自閉合
        <element_name attribute_name="value" ...>        //
        1-String
        2-<element_name attribute_name="value" .../>
        3-<element_name attribute_name="value" .../>
        ...
        </element_name>

        </element_name>    對                        

 

XML的四種解析 

  目前常用的XML解析技術有4種:

(1)DOM

  DOM是基於XML的樹結構來完成解析的,DOM解析XML的方式非常適用於多次訪問XML的應用程序,但是其比較消耗資源;

(2)SAX

  SAX是一種基於事件的解析,其主要是為了解決DOM解析的資源消耗問題而出現的,其優勢是占用資源少,內存消耗小,一般在處理解析數據量大的XML文檔才會使用

(3)JDOM

  JDOM的目的是直接為JAVA編程服務,利用純Java技術對XML文檔實現解析生成,序列化以及其他操作;

(4)DOM4J
  DOM4J具有性能優異、功能強大和易用的特點,同時它也是一個開放源代碼的軟件

如何用DOM4J解析XML數據

注:使用DOM4J解析XML,依賴於jar包 dom4j和jaxen

  實現的步驟:

    指定要解析的XML文件;

    把XML文件轉換成Document對象;

    獲取節點屬性或文本的值。

        File xml = new File("xmlfiles/xxx");
        SAXReader reader = new SAXReader();
        Document doc = reader.read(xml);//轉換為文件
        Element root = doc.getRootElement();//獲取節點屬性
        List<Element> elements = root.elements();   //element 節點

 

 

下面舉一例分別分析xml文檔

  xml文檔內容如下

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

<root> 
  <student id="1"> 
    <name>張飛</name>
    <age>999</age>
    <gender>男</gender> 
  </student>  
  <student id="2"> 
    <name>關羽</name>
    <age>888</age>
    <gender>男</gender>
  </student>  
  <student id="3">
    <name>劉備</name>
    <age>777</age>
    <gender>男</gender>
  </student> 
</root>

 

若要讀取XML文檔中,可以直接用字符串輸出的方式遍歷,首先獲取子元素,再遍歷子元素文本

        //字符串輸出
        for (Element element : elements) {
            String id = element.attributeValue("id");//獲取當前指定子元素
            System.out.print(id+"\t");
            List<Element> subEs = element.elements();
            for (Element subE : subEs) {
                System.out.print(subE.getText()+"\t");//獲取當前子元素文本
            }
            System.out.println("\n");
        }

 

 

對於一個XML文檔,我們也許需要檢索所有的內容,但有時也可能需要檢索某一固定節點或某一個屬性,因此我們需要采取不同的檢索方式

  (1)當我們需要檢索所有內容時,可以用動態數組的形式遍歷出來即可;

  (2)當需要檢索某一固定節點

    Node node = document.selectSingleNode("//nodeName[@attrName = value]");

  (3)檢索某一屬性(多節點檢索)

    List<Element> = document.selecNodes("//nodeName[subEleName/text()='value']");

 

   取一分析結果,輸出如下

 //檢索固定節點
        Node node = doc.selectSingleNode("//student[@id=3]");//任意以student為根的節點
       if (null != node){
           Element element =(Element)node;
           String id = element.attributeValue("id");
           String name = element.elementText("name");
           String age = element.elementText("age");
           String gender = element.elementText("gender");
           Student student = new Student(Integer.parseInt(id),name,Integer.parseInt(age),gender);
           System.out.println(student);
       }

 

當我們需要對XML文件進行改動時,有三種情況分別為新增、刪除以及修改(變動過之后必須落盤)

  (1)新增

    Element ele = root.addElement(...);

    Element subEle = ele.addElement(String nodeName);

  (2)刪除

    Element xxx = ...

    father.renmove(xxx);

  (3)修改

    xxx.attribute(String attrName).setValue(String value);

    xxx.element(String subName).setText(String text);

  下面例子為刪除操作

  

//刪除
        //內存操作
        Node node = doc.selectSingleNode("//xxx[@id=3]");
        if (null != node){
            root.remove(node);
            //存盤
            OutputFormat format  = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(new OutputStreamWriter(
                new FileOutputStream("xmlfiles/kb.xml"),"UTF-8"),format);
            writer.write(doc);
            writer.flush();
            writer.close();
        }else {
            System.out.println("用戶不存在");
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM