Todd

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            65 隨筆 :: 0 文章 :: 24 評論 :: 0 Trackbacks

          java dom4j操作xml

          SAXReader reader = new SAXReader();    
          Document doc = reader.read(...);    
          List childNodes = doc.selectNodes("http://Config/Child/ChildNode");    
          for(Object obj:childNodes) {    
                Node childNode = (Node)obj;    
                String name = childNode.valueOf("@name");    
                String text = childNode.getText();    
          }      

          一.Document 對象相關   

                1. 讀取XML文件,獲得document對象.   
                      
          SAXReader reader = new SAXReader();   
                      Document   document = reader.read(new File("input.xml"));   

                 2.解析XML形式的文本,得 到document對象.   
                      String text = "<members></members>";   
                      Document document = DocumentHelper.parseText(text);   

                3.主動創建document 對象.   
                      Document document = DocumentHelper.createDocument();   
                      Element root = document.addElement("members");// 創建根節點   


          二.節點相關   

                1.獲取文檔的根節點.   
                      Element rootElm = document.getRootElement();   
                2.取得某節點的單個子節 點.   
                      
          Element memberElm=root.element("member");// "member"是節點名   
                3.取得節點的文字   
                      String text=memberElm.getText(); 也可以用:   
                      
          String text=root.elementText("name");這個是取得根 節點下的name字節點的文字.   
                
          4.取得某節點下名為"member"的所有字節點并 進行遍歷.   
                      
          List nodes = rootElm.elements("member");   
                      for (Iterator it = nodes.iterator(); it.hasNext();) {   
                            Element elm = (Element) it.next();   
                            // do something   
                      }   
                5.對某節點下的所有子節點進 行遍歷.   
                      
           for(Iterator it=root.elementIterator();it.hasNext();){   
                            Element element = (Element) it.next();   
                             // do something   
                      }   
                6.在某節點下添加子節 點.   
                      
          Element ageElm = newMemberElm.addElement("age");   
                7.設置節點文字.   
                      ageElm.setText("29");   
                8.刪除某節點.   
                      parentElm.remove(childElm);// childElm是待刪除的節點,parentElm是其父節 點   
                9. 添加一個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();   
                      //  這個是取得根節點下name字節點的屬性firstname的值:  
                      String text2=root.element("name").attributeValue("firstname");
                3.遍歷某節點的所有屬 性    
                      Element root=document.getRootElement();        
                      for(Iterator it=root.attributeIterator();it.hasNext();){    
                           Attribute attribute = (Attribute) it.next();    
                           String text=attribute.getText();    
                           System.out.println(text);    
                      }
                4.設置某節點的屬性和文 字.    
                      newMemberElm.addAttribute("name""sitinspring");    
                5.設置屬性的文字   
                     Attribute attribute=root.attribute("name");    
                     attribute.setText("sitinspring");    
                6.刪除某屬性    
                     Attribute attribute=root.attribute("size");// 屬性名name    
                     root.remove(attribute);   

          四.將文檔寫入XML文件.    
                
                1.文檔中全為英文,不設置編 碼,直接寫入的形式.    
                      XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));    
                      writer.write(document);    
                      writer.close();    
                2.文檔中含有中文,設置編碼 格式寫入的形式.    
                      OutputFormat format = OutputFormat.createPrettyPrint();    
                      format.setEncoding("GBK");    // 指定XML編碼            
                      XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);                    
                      writer.write(document);    
                      writer.close();   

          五.字符串與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"));                
                      Element root=document.getRootElement();                    
                      String docXmlText=document.asXML();    
                      String rootXmlText=root.asXML();    
                      Element memberElm=root.element("member");    
                      String memberXmlText=memberElm.asXML();      


                {     dom4j API 包含一個解析 XML 文檔的工具。本文中將使用這個解析器創建一個示例 XML 文檔。清單 1 顯示了這個示例 XML 文檔,catalog.xml。   } 

                
                清單 1. 示例 XML 文檔(catalog.xml)     
                      <?xml version="1.0" encoding="UTF-8"?>     
                      <catalog>     
                            <!--An XML Catalog-->     
                            <?target instruction?>    
                            <journal title="XML Zone" publisher="IBM developerWorks">     
                                  <article level="Intermediate" date="December-2001">    
                                         <title>Java configuration with XML Schema</title>     
                                         <author>     
                                               <firstname>Marcello</firstname>     
                                               <lastname>Vitaletti</lastname>     
                                         </author>    
                                   </article>    
                            </journal>     
                      </catalog>      

                      
                      然 后使用同一個解析器修改 catalog.xml,清單 2 是修改后的 XML 文檔,catalog- modified.xml。    
                
                清單 2. 修改后的 XML 文檔 (catalog-modified.xml)     
                      <?xml version="1.0" encoding="UTF-8"?>     
                      <catalog>     
                            <!--An XML catalog-->     
                            <?target instruction?>    
                            <journal title="XML Zone" publisher="IBM developerWorks">     
                                  <article level="Introductory" date="October-2002">    
                                        <title>Create flexible and extensible XML schemas</title>   
                                        <author>     
                                              <firstname>Ayesha</firstname>     
                                              <lastname>Malik</lastname>     
                                         </author>     
                                  </article> 
                            </journal>
                      </catalog>    

                            與 W3C DOM API 相 比,使用 dom4j 所包含的解析器的好處是 dom4j 擁有本地的 XPath 支持。DOM 解析器不支持使用 XPath 選擇節點。   

          .xpath語法

          選取節點

          XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿著路徑或者 step 來選取的。

          下 面列出了最有用的路徑表達式:

          表達式 描述
          nodename 選取此節點的所有子節點
          / 從根節點選取
          // 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置
          . 選取當前節點
          .. 選取當前節點的父節點
          @ 選取屬性

          實例

          在下面 的表格中,我們已列出了一些路徑表達式以及表達式的結果:

          路徑表達式 結 果
          bookstore 選取 bookstore 元素的所有子節點
          /bookstore

          選取根元素 bookstore

          注釋:假如路徑起始于正斜杠( / ),則此路徑始終代表到某元素的絕對路徑!

          bookstore/book 選 取所有屬于 bookstore 的子元素的 book 元素。
          //book 選取所有 book 子元素,而不管它們在文檔中的位置。
          bookstore//book 選擇所有 屬于 bookstore 元素的后代的 book 元素,而不管它們位于 bookstore 之下的什么位置。
          //@lang 選取所有名為 lang 的屬性。

          謂語 (Predicates)

          謂語用來查找某個特定的節點或者包含某個指定的值的節點。

          謂語被嵌在方括號中。

          實 例

          在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:

          路 徑表達式 結果
          /bookstore/book[1] 選取屬于 bookstore 子元素的第一個 book 元素。
          /bookstore/book[last()] 選取屬于 bookstore 子元素的最后一個 book 元素。
          /bookstore/book[last()-1] 選取屬于 bookstore 子元素的倒數第二個 book 元素。
          /bookstore/book[position()<3] 選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素。
          //title[@lang] 選取所有擁有名為 lang 的屬性的 title 元素。
          //title[@lang='eng'] 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。
          /bookstore/book[price>35.00] 選取所有 bookstore 元素的 book 元素,且其中的 price 元素的值須大于 35.00。
          /bookstore/book[price>35.00]/title 選取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值須大于 35.00。

          選取未知節點

          XPath 通配符可用來選取未知的 XML 元素。

          通配符 描述
          * 匹配任何元素節點
          @* 匹配任何屬性節點
          node() 匹配任何類型的節點

          實例

          在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

          路徑表達式 結果
          /bookstore/* 選取 bookstore 元素的所有子節點
          //* 選取文檔中的所有元素
          //title[@*] 選取所有帶有屬性的 title 元素。

          選取若干路徑

          通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。

          實 例

          在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

          路 徑表達式 結果
          //book/title | //book/price 選 取所有 book 元素的 title 和 price 元素。
          //title | //price 選取所有文檔中的 title 和 price 元素。
          /bookstore/book/title | //price 選取所有屬于 bookstore 元素的 book 元素的 title 元素,以及文檔中所有的 price 元素。


          XPath 軸

          軸可定義某個相對于當前節點的節點集。

          軸名稱 結果
          ancestor 選取當前節點的所有先輩(父、祖父等)
          ancestor-or-self 選取當前節點的所有先輩(父、祖父等)以及當前節點本身
          attribute 選 取當前節點的所有屬性
          child 選取當前節點的所有子元素。
          descendant 選取當前節點的所有后代元素(子、孫等)。
          descendant-or-self 選取當前節點的所有后代元素(子、孫等)以及當前節點本身。
          following 選 取文檔中當前節點的結束標簽之后的所有節點。
          namespace 選取當前節點的所有命名 空間節點
          parent 選取當前節點的父節點。
          preceding 選取文檔中當前節點的開始標簽之前的所有節點。
          preceding-sibling 選 取當前節點之前的所有同級節點。
          self 選取當前節點。

          位置路徑表達式

          位置路徑可以是絕對的,也可以是相對的。

          絕對路徑起始于正斜杠( / ),而相對路徑不會這樣。在兩種情況中,位置路徑均包括一個或多個步,每個步均被斜杠分割:

          絕對位置路徑:

          /step/step/...

          相對位置路徑:

          step/step/...

          每個步均根據當前節點集之中的節點來進行計算。

          步(step)包括:

          軸(axis)
          定義所選節點與當前節點之間的樹關系
          節 點測試(node-test)
          識別某個軸內部的節點
          零個或者更多謂語(predicate)
          更深 入地提煉所選的節點集

          步的語法:

          軸名稱::節點測試[謂語]

          實例

          例子 結果
          child::book 選取所有屬于當前節點的子元素的 book 節點
          attribute::lang 選 取當前節點的 lang 屬性
          child::* 選取當前節點的所有子元素
          attribute::* 選取當前節點的所有屬性
          child::text() 選取當前節點的所有文本子節點
          child::node() 選取當前節點的所有 子節點
          descendant::book 選取當前節點的所有 book 后代
          ancestor::book 選擇當前節點的所有 book 先輩
          ancestor-or-self::book 選取當前節點的所有book先輩以及當前節點(假如此節點是book節點的 話)
          child::*/child::price 選取當前節點的所有 price 孫。

          XPath 運算符

          下面列出了可用在 XPath 表達式中的運算符:

          運算符 描述 實例 返回值
          | 計算兩個節點集 //book | //cd 返回所有帶有 book 和 ck 元素的節點集
          + 加法 6 + 4 10
          - 減法 6 - 4 2
          * 乘法 6 * 4 24
          div 除法 8 div 4 2
          = 等于 price=9.80

          如果 price 是 9.80,則返回 true。

          如 果 price 是 9.90,則返回 fasle。

          != 不等于 price!=9.80

          如果 price 是 9.90,則返回 true。

          如果 price 是 9.80,則返回 fasle。

          < 小于 price<9.80

          如 果 price 是 9.00,則返回 true。

          如果 price 是 9.90,則返回 fasle。

          <= 小于或等于 price<=9.80

          如果 price 是 9.00,則返回 true。

          如果 price 是 9.90,則返回 fasle。

          > 大于 price>9.80

          如果 price 是 9.90,則返回 true。

          如果 price 是 9.80,則返回 fasle。

          >= 大于或等于 price>=9.80

          如果 price 是 9.90,則返回 true。

          如果 price 是 9.70,則返回 fasle。

          or price=9.80 or price=9.70

          如果 price 是 9.80,則返回 true。

          如果 price 是 9.50,則返回 fasle。

          and price>9.00 and price<9.90

          如果 price 是 9.80,則返回 true。

          如果 price 是 8.50,則返回 fasle。

          mod 計算除法的余數 5 mod 2 1

          【注】Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
          下載 jaxen-1.1.1.jar包
          posted on 2010-05-22 18:26 Todd 閱讀(6620) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 扶绥县| 天柱县| 磴口县| 巴东县| 清苑县| 恩施市| 额济纳旗| 西平县| 景泰县| 本溪市| 方正县| 旺苍县| 娄底市| 合作市| 湾仔区| 达孜县| 岳阳县| 封丘县| 柘城县| 濮阳市| 康平县| 东光县| 禄丰县| 西华县| 时尚| 上思县| 兰考县| 莎车县| 长沙市| 阜阳市| 嵊州市| 临洮县| 利津县| 梁平县| 温宿县| 阳曲县| 敦化市| 邳州市| 建平县| 康平县| 宁武县|