Dom4j 解析Xml文檔及 XPath查詢 學習筆記


本文查閱方法:
    一、查閱目錄 —— 查閱本文目錄,肯定想要查閱的目錄標題
    二、快捷「查找」 —— 在當前瀏覽器頁面,按鍵 「Ctrl+F」 按鍵組合,開啓瀏覽器的查找功能,
             在查找搜索框中 輸入須要查閱的 目錄標題,即可以直接到達 標題內容 的位置。
    三、學習小結 —— 文中的學習小結內容,是筆者在學習以後總結出的,開發時可直接參考其進行應用開發的內容, 進一步加快了本文的查閱 速度。(水平有限,僅供參考。)java

 

 

 


 

本文目錄node

 

    學習小結web

 

     一、Dom4j 概述
     二、獲取 Document對象
     三、將文檔(document)寫入XML文件/更新XML文件     spring

 

     四、獲取/操做 節點對象 瀏覽器

 

           (1)獲取文檔的根節點.dom

 

           (2)取得某個節點指定名稱的子節點.性能

 

           (3)取得節點的文字學習

 

           (4)取得某節點下全部 指定名稱 的子節點,並進行遍歷.  編碼

 

           (5)對某節點下的全部子節點進行遍歷.  .net

 

           (6)在某節點下添加子節點.

 

           (7)設置節點文字. 

 

           (8)刪除某節點. //childElm是待刪除的節點,parentElm是其父節點

 

           (9)Dom4j在指定位置插入節點 

 

           (10)添加一個CDATA節點. 

 

      五、獲取/操做 節點對象屬性

 

           (1)取得某節點下的某屬性對象 

 

           (2)取得屬性的文字

 

           (3)刪除某屬性  

 

           (4)遍歷某節點的全部屬性    

 

           (5)設置某節點的屬性和文字.

 

           (6)設置屬性的文字

 

      六、字符串與XML的轉換 

 

          (1)將字符串轉化爲XML 

 

          (2)文檔或節點的XML轉化爲字符串. 

 

     七、操做xml節點 以及節點屬性的 Demo範例集合
     八、XPath:超級強大的Xml文檔 節點查詢定位 技術
     九、XPath  使用方法範例Demo 

 

 

 相關文章
    XML文檔語法 學習筆記
        地址:http://even2012.iteye.com/blog/1828064

    DTD約束 —— Xml文檔 約束技術 學習筆記
        地址:http://even2012.iteye.com/blog/1828290

    Schama —— Xml文檔約束技術 學習筆記
        地址:http://even2012.iteye.com/blog/1832073

    Dom4j 解析Xml文檔及 XPath查詢  學習筆記
        地址:http://even2012.iteye.com/blog/1832068

    Jaxp :Dom解析Xml文檔和SAX解析Xml文檔學習筆記
        地址:http://even2012.iteye.com/blog/1829981


 

 

 

學習小結

 

  (一) 使用Dom4j 操做Xml文檔的三個步驟:
     (1)獲取document對象:
          SAXReader reader = new SAXReader();              
          Document  document = reader.read(new File("input.xml"));
     (2)操做節點對象及其屬性
          A.使用XPath方式 查詢獲取節點
              a.查詢僅單個節點:document.selectSingleNode("查詢表達式"); 
              b.查詢多個節點:  document.selectNodes("查詢表達式"); 
          ​B.普通方式獲取節點。
              Element root = document.getRootElement();     
     (3)將document對象寫回到xml文檔
          OutputFormat format = OutputFormat.createPrettyPrint();  
          format.setEncoding("UTF-8");  // 指定XML編碼 
          XMLWriter writer = new XMLWriter(new FileOutputStream("output.xml"),format); 
          writer.write(document);   
          writer.close();

 

  (二)"從無到有"生成document對象
     (1)解析XML形式的文本,獲得document對象. 
          String text = "<members></members>";   //建立根節點           
          Document document = DocumentHelper.parseText(text);
     (2)主動建立document對象. 
          Document document = DocumentHelper.createDocument();  
          Element root = document.addElement("members");//建立根節點 

 

 

 


 

  

 

一、Dom4j 概述

 

    Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來然後獨立開發的。與JDOM不一樣的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對要複雜一些,但它提供了比JDOM更好的靈活性。 

 

    Dom4j是一個很是優秀的Java XML API,具備性能優異、功能強大和極易使用的特色。如今不少軟件採用的Dom4j,例如Hibernate,包括sun公司本身的JAXM也用了Dom4j。

 

    使用Dom4j開發,需下載dom4j相應的jar文件。

 

    備註:在使用Dom4j開發中,要導入一些類的包時,必定要導入Dom4j的本身的包名,不然就會出現須要轉類型的提示信息。如果強行轉換,則將沒法使用Dom4j提供的強大的功能的良好的性能。

 

 

 


 

 

 

二、獲取 Document對象

 

    DOM4j中,得到Document對象的方式有三種: 

 

      (1)讀取XML文件,得到document對象【有源模式:源Xml文檔必須已經存在】            

 

           SAXReader reader = new SAXReader();              

 

           Document   document = reader.read(new File("input.xml"));

 

     

 

      (2)解析XML形式的文本,獲得document對象. 【無源模式:無需存在源Xml文檔】

 

           String text = "<members></members>";   //建立根節點           

 

           Document document = DocumentHelper.parseText(text);

 

     

 

      (3)主動建立document對象.【無源模式:無需存在源Xml文檔】 

 

           Document document = DocumentHelper.createDocument();  

 

           Element root = document.addElement("members");//建立根節點 

 

 

 


 

   

 

三、將文檔(document)寫入XML文件/更新XML文件  . 

 

    (1)文檔中全爲英文,不設置編碼,直接寫入的形式.   

 

        XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));   

 

        writer.write(document);   

 

        writer.close();     

 

    (2)文檔中含有中文,設置編碼格式寫入的形式. 

 

        OutputFormat format = OutputFormat.createPrettyPrint();   // Pretty [ˈpriti]   

 

                // format [ˈfɔ:mæt]           

 

        format.setEncoding("GBK");  // 指定XML編碼 

 

        XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format); 

 

        writer.write(document);     //注:爲避免編碼問題,此處也可以使用new FileOutputStream("").

 

        writer.close();

 

 

 


 

 

 

四、獲取/操做 節點對象 

 

    (1)獲取文檔的根節點.

 

          Demo樣例:Element root = document.getRootElement();     

 

    (2)取得某個節點指定名稱的子節點.

 

          Demo樣例:Element childElement=anyNode.element(「書名");     

 

    (3)取得節點的文字

 

          Demo樣例: String text=anyNode.getText(); 

 

    (4)取得某節點下全部 指定名稱 的子節點,並進行遍歷.  

 

          Demo樣例: 

 

            List nodes = element.elements("member");     

 

            for (Iterator it = nodes.iterator(); it.hasNext();) {      

 

                Element element = (Element) it.next();  

 

                //do something  

 

            }     

 

    (5)對某節點下的全部子節點進行遍歷.     

 

           for(Iterator it=element.elementIterator();it.hasNext();){        

 

                Element element = (Element) it.next(); 

 

                //do something     

 

           }

 

    (6)在某節點下添加子節點. 

 

          Element ageElement  = element.addElement("age");

 

    (7)設置節點文字.  

 

          element.setText("29");     

 

    (8)刪除某節點. //childElm是待刪除的節點,parentElm是其父節點

 

          parentElm.remove(childElm); 

 

    (9)Dom4j在指定位置插入節點 

 

        a.獲得插入位置的節點列表(list)

 

        b.調用list.add(index,elemnent),由index決定element的插入位置。

 

            Element元素能夠經過DocumentHelper對象獲得。

 

            示例代碼: 

 

                Element aaa = DocumentHelper.createElement("aaa");

 

                aaa.setText("aaa"); 

 

                List list = root.element("書").elements();

 

                list.add(1, aaa); 

 

 

 

    (10)添加一個CDATA節點. 

 

          Element contentElm = infoElm.addElement("content"); 

 

          contentElm.addCDATA(diary.getContent());

 


 

 

 

五、獲取/操做 節點對象屬性 

 

    (1)取得某節點下的某屬性對象     

 

        Element root=document.getRootElement();   

 

        Attribute attribute=root.attribute("size"); //屬性名name 

 

    (2)取得屬性的文字     

 

        String text=attribute.getText(); 

 

    (3)刪除某屬性  

 

        Attribute attribute=root.attribute("size");  

 

        root.remove(attribute);

 

    (4)遍歷某節點的全部屬性    

 

        Element root=document.getRootElement();        

 

        for(Iterator it=root.attributeIterator();it.hasNext();){          

 

            Attribute attribute = (Attribute) it.next();          

 

            String text=attribute.getText();          

 

            System.out.println(text);     

 

        } 

 

    (5)設置某節點的屬性和文字.    

 

        newMemberElm.addAttribute("name", "sitinspring");     

 

    (6)設置屬性的文字    

 

        Attribute attribute=root.attribute("name");    

 

        attribute.setText("sitinspring"); 

 

     


 

 

 

六、字符串與XML的轉換 

 

    (1)將字符串轉化爲XML  

 

        String text = "<members> <member>sitinspring</member></members>"; 

 

        Document document = DocumentHelper.parseText(text); 

 

    (2)文檔或節點的XML轉化爲字符串. 

 

        SAXReader reader = new SAXReader(); 

 

        Document   document = reader.read(new File("input.xml"));           

 

        String docXmlText=document.asXML(); 

 

 

 

        Element root=document.getRootElement();   

 

        String rootXmlText=root.asXML(); 

 

 

 

        Element memberElm=root.element("member"); 

 

        String memberXmlText=memberElm.asXML(); 

 

 

 

     【備註:其餘的API可參見 附件資料:《dom4jAPI幫助文檔》】

 

 

 


 

 七、操做xml節點 以及節點屬性的 Demo範例集合

 

 

 

//dom4j解析xml文檔

 

public class Demo1 { 

 

  //遍歷xml文檔全部標籤

 

      @Test

 

      public void listFile() throws Exception{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml"));

 

            Element root = document.getRootElement();

 

            list(root);

 

      } 

 

      public void list(Element e){

 

            System.out.println(e.getName());

 

            List<Element> list = e.elements();

 

            for(Element child : list){

 

                  list(child);

 

            }

 

      }

 

 

 

  //獲取:<書名 name="aaa">javaweb開發</書名> 節點內容

 

      @Test

 

      public void test1() throws Exception{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml"));

 

            String value = document.getRootElement().element("書").element("書名").getText();

 

            System.out.println(value);

 

      }

 

 

 

  //獲取:<書名 name="aaa">javaweb開發</書名> 節點屬性

 

      @Test

 

      public void test2() throws Exception{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml"));

 

            Element bookname = document.getRootElement().element("書").element("書名");

 

            System.out.println(bookname.attributeValue("name"));

 

      }

 

 

 

  //向xml文檔中添加一個售價節點

 

      @Test

 

      public void test3() throws Exception{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml")); 

 

            //建立要添加的節點

 

            Element e = DocumentHelper.createElement("售價");

 

            e.setText("39元"); 

 

            //把節點掛到書下

 

            document.getRootElement().element("書").add(e); 

 

            //把更新的內容寫回到xml  docunment(UTF-8)

 

            /*XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),"UTF-8"));

 

            writer.write(document);

 

            writer.close();*/ 

 

     

 

            /*XMLWriter writer = new XMLWriter(new FileWriter("src/book.xml"));

 

            writer.write(document);

 

            writer.close();*/

 

         

 

            /*OutputFormat format = OutputFormat.createPrettyPrint();

 

            format.setEncoding("UTF-8");*/ 

 

        

 

            OutputFormat format = OutputFormat.createCompactFormat();

 

            format.setEncoding("UTF-8");

 

            XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);

 

            writer.write(document);    //推薦這種XML輸出流,防止亂碼的出現。

 

            writer.close(); 

 

      }

 

 

 

  //向xml文檔中添加一個售價節點

 

      @Test

 

      public void test4() throws Exception{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml")); 

 

            document.getRootElement().element("書").addElement("售價").setText("189元"); 

 

            OutputFormat format = OutputFormat.createPrettyPrint();

 

            format.setEncoding("UTF-8");

 

            XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);

 

            writer.write(document);

 

            writer.close(); 

 

      }

 

 

 

  //向xml文檔的指定位置添加一個售價節點

 

      @Test

 

      public void test5() throws Exception{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml")); 

 

            //建立要添加的節點

 

            Element e = DocumentHelper.createElement("售價");

 

            e.setText("39元"); 

 

            List list = document.getRootElement().element("書").elements();

 

            list.add(2, e); 

 

            OutputFormat format = OutputFormat.createPrettyPrint();

 

            format.setEncoding("UTF-8");

 

            XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);

 

            writer.write(document);

 

            writer.close();

 

      }

 

 

 

  //刪除節點

 

      @Test

 

      public void test6() throws Exception{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml")); 

 

            Element e = (Element) document.getRootElement().element("書").elements("售價").get(1);

 

            e.getParent().remove(e); 

 

            //更新

 

            OutputFormat format = OutputFormat.createPrettyPrint();

 

            format.setEncoding("UTF-8");

 

            XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);

 

            writer.write(document);

 

            writer.close();

 

      }

 

 

 

  //修改節點的值:第二本書售價的值

 

      @Test

 

      public void test7() throws Exception{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml")); 

 

            Element e = (Element) document.getRootElement().elements("書").get(1);

 

            e.element("售價").setText("890元"); 

 

            //更新

 

            OutputFormat format = OutputFormat.createPrettyPrint();

 

            format.setEncoding("UTF-8");

 

            XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);

 

            writer.write(document);

 

            writer.close();

 

      }

 

 

 

  //  根據節點裏的內容刪除內容所在的節點?

 

      @Test

 

      public void test8() throws DocumentException, IOException{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml"));

 

            Element root = document.getRootElement();

 

            list1(root); 

 

            //更新

 

            OutputFormat format = OutputFormat.createPrettyPrint();

 

            format.setEncoding("UTF-8");

 

            XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);

 

            writer.write(document);

 

            writer.close();

 

      }

 

 

 

      public void list1(Element e){

 

            String  value = e.getText();

 

            if("JavaScript網頁開發".equals(value)){

 

                  e.getParent().remove(e);

 

            }

 

            List<Element> list = e.elements();

 

            for(Element child : list){

 

                  list1(child);

 

            }

 

      } 

 

}

 

 

 


 

 

 

 八、XPath:超級強大的Xml文檔 節點查詢定位 技術

 

    XPath 是dom4j組織提供的很是強大的 Xml文檔 節點查詢定位 技術 ,利用它能夠很是快速的定位並獲取到所須要的節點對象。甚至能夠對查詢條件設置不少的限定約束。

 

    基本應用語法:

 

        (1)查詢僅單個節點:document.selectSingleNode("查詢表達式"); 

 

        (2)查詢多個節點:  document.selectNodes("查詢表達式"); 

 

    其中的查詢表達式 使其實現快速查詢定位關鍵,XPath中各類豐富的查詢表達式語法 學習 附件資料《XPath Tutorial(菜鳥必備)》 ,資料中共列出了 近22種實例 供你們學習。

 

    其使用方法則參加下面的範例Demo

 

    

 


 

九、XPath  使用方法範例Demo 

 

 

 

public class Demo2 { 

 

 // 簡單查詢條件的應用 

 

      @Test   

 

      public void test1() throws Exception{

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/book.xml"));

 

         

 

            Element e = (Element) document.selectSingleNode("//做者");

 

            System.out.println(e.getText());

 

         

 

            Element e1 = (Element) document.selectNodes("//做者").get(1);

 

            System.out.println(e1.getText());

 

      }

 

 

 

  // 複雜查詢條件 。實現用戶名和密碼校驗功能。重點參考,很是好

 

      @Test

 

      public void test2() throws Exception{

 

            String username = "aaa1";

 

            String password = "123";

 

         

 

            SAXReader reader = new SAXReader();

 

            Document document = reader.read(new File("src/users.xml"));

 

         

 

            Node node = document.selectSingleNode("//user[@username='"+username+"' and @password='"+password+"']");

 

            if(node!=null){

 

                  System.out.println("登錄成功!!");

 

            }else{

 

                  System.out.println("用戶名或密碼錯誤,登錄失敗!!");

 

            } 

 

      } 

 

}

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章
相關標籤/搜索