1. 程式人生 > >dom4j簡單學習 element和node的區別

dom4j簡單學習 element和node的區別

               

使用dom4j解析處理html時,遇到一些麻煩的問題:

基中必須要使用XPath取得節點,有個名稱空間的問題,需要如下處理:HashMap<String, String> gm = new HashMap<String, String>();gm.put("xmlns", "http://www.w3.org/1999/xhtml");Document rootDoc = DocumentHelper.parseText(s);XPath xpathTable = DocumentHelper.createXPath("//xmlns:table[@class=\"tableList\"]");xpathTable.setNamespaceURIs(gm);List<Node> tables = xpathTable.selectNodes(rootDoc);現在取出來是Node物件(比如一個table),再往下取時,再用node1.selectNodes會取不到東西,可能還是因為名稱空間的麻煩問題,所以最好轉為Element,就很容易了,element1.elements("tr"),就可以方便地迴圈了,比較奇怪的是轉換為Element的方法居然是強轉-_-!
Element table1 = (Element) tables.get(0); // 第一個表格由此可以這樣理解Node和Element,Node是節點,一個屬性、一段文字、一個註釋等都是節點,而Element是元素,是比較完整的一個xml的元素,即我們口頭上說的xml“結點”(此處故意使用“結”字,以示與“節點”Node區別),呵呵……

dom4j幫助文件在dom4j-1.6.1/docs/guide.html檔案裡面,全部是英文,但是基本上應該能看懂。

1、  四種操作xml的方式:SAX,DOM,JDOM,DOM4J.

2、  DOM(Document Object Model):意思是把整個xml做為一個整體物件,直接全部放到記憶體裡面,不管xml檔案有多大;

3、  SAX=Sample API for XML:假如xml檔案有2G,用第一種方式,是很困難的,SAX用的是一種類似流媒體方式進行的。

DOM和SAX是java的API,處理xml檔案的時候,相對來說是比較困難的,於是出現了下面兩種框架,包裝了上面兩個框架。

4、  JDOM:

5、  DOM4J:

6、  利用DOM4J解析xml檔案(讀取所有的屬性節點)。

Document可以理解為整個文件物件

取root節點。Document.getRootElement()返回的是一個Element(元素)

7、  理解運用xpath,path就是路徑,xpath在xml檔案裡面找到特定的節點。

Document.selectNodes(“//hibernate-mapping/class/property”)  //其中hibenate-mapping是根節點。做變org.dom4j.Node物件返回的。

Document.selectSingleNodes(“//hibernate-mapping/class/property”)//只拿第一個。

基中@name是property的屬性名valueOf是拿出name的值;

需要加入DOM4J裡面的jaxen包

8、  DOM4J的生成xml檔案

9、  用FileWriter生成xml檔案的時候,可能沒有格式,可以用XMLWriter類,這樣自動進行美化。

10、  DOM4J修改xml檔案;很少用。

11、  自動生成程式碼往往用的是:freemarker或velocity,這是常用的。用dom4j生成也很少用。

12、  怎麼用表裡面的結構生成xml檔案。

13、 JavaDB

a)       Properties物件:可以理解為一個表格對應key,value

14、  Databasemetadata,可以能過這個JDK類,讀取資料庫的表結構,通過這個表結構做一些自己的事情。(熟悉用法)通過JDK文件和google學習

15、   元資料就是資料的資料,用來描述資料的資料。

16、   DWR,對Ajax框架封住得比較好,是類和java的結合。

dom4j學習例項:

  1. package hb.dom4j;  
  2. import java.io.FileWriter;  
  3. import java.io.IOException;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6. import org.dom4j.Attribute;  
  7. import org.dom4j.Document;  
  8. import org.dom4j.DocumentException;  
  9. import org.dom4j.DocumentHelper;  
  10. import org.dom4j.Element;  
  11. import org.dom4j.Node;  
  12. import org.dom4j.io.OutputFormat;  
  13. import org.dom4j.io.SAXReader;  
  14. import org.dom4j.io.XMLWriter;  
  15. publicclass MyJdomReaderXML {  
  16.     public Document parse(String string) throws DocumentException {  
  17.         SAXReader reader = new SAXReader();  
  18.         Document document = reader.read(string);  
  19.         return document;  
  20.     }  
  21.     publicvoid bar(Document document) throws DocumentException {  
  22.         Element root = document.getRootElement();//獲得根節點;
  23.         //進行迭代;讀取根節點下的所有節點和子節點下的所有節點
  24.         for (Iterator i = root.elementIterator(); i.hasNext();) {  
  25.             Element element = (Element) i.next();  
  26.             System.out.println(element.getName());  
  27.             for (Iterator j = element.elementIterator(); j.hasNext();) {  
  28.                 System.out.println(((Element) j.next()).getName());  
  29.             }  
  30.         }  
  31.         //讀取節點名為foo的所有子節點
  32.         for (Iterator i = root.elementIterator("foo"); i.hasNext();) {  
  33.             Element foo = (Element) i.next();  
  34.             System.out.println(foo.getName());  
  35.         }  
  36.         //讀取根節點的所有屬性
  37.         for (Iterator i = root.attributeIterator(); i.hasNext();) {  
  38.             Attribute attribute = (Attribute) i.next();  
  39.             System.out.println(attribute.getName());  
  40.         }  
  41.     }  
  42.     /* 
  43.      * 可以根據節點名字讀取節點,也可以讀取節點裡的key和value 
  44.      */
  45.     publicvoid readNodes(Document document) {  
  46.         List list = document.selectNodes( "//foo/bar" );   //foo為根節點,獲得根節點下的bar節點  
  47.         Node node = document.selectSingleNode( "//foo/bar/author" );  //獲得名為author的第一 節點  
  48.         String name = node.valueOf( "@name" ); //獲得節點名屬性名為name的value
  49.     }  
  50.     /* 
  51.      * 如果xml檔案很大的情況下,用上面的方法很費時,這樣 可以用遞迴遍歷整個xml檔案 
  52.      */
  53.     publicvoid treeWalk(Document document) {  
  54.         treeWalk(document.getRootElement());  
  55.     }  
  56.     /* 
  57.      * 遞迴呼叫,傳遞每一個父節點做為引數 
  58.      */
  59.     publicvoid treeWalk(Element element) {  
  60.         for (int i = 0, size = element.nodeCount(); i < size; i++) {  
  61.             Node node = element.node(i);  
  62.             if (node instanceof Element) {//如果node實現了Element介面,那麼就表示node是一個節點。再遞迴
  63.                 treeWalk((Element) node);  
  64.                 System.out.println(((Element) node).getName()+":"+node.valueOf("@name"));  
  65.             } else {//如果沒有實現Element介面,那麼就表示這個node不是節點了,輸出節點等操作;
  66.             }  
  67.         }