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的方法居然是強轉-_-!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學習例項:
- package hb.dom4j;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.Iterator;
- import java.util.List;
- import org.dom4j.Attribute;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.Node;
- import org.dom4j.io.OutputFormat;
- import org.dom4j.io.SAXReader;
- import org.dom4j.io.XMLWriter;
- publicclass MyJdomReaderXML {
- public Document parse(String string) throws DocumentException {
- SAXReader reader = new SAXReader();
- Document document = reader.read(string);
- return document;
- }
- publicvoid bar(Document document) throws DocumentException {
- Element root = document.getRootElement();//獲得根節點;
- //進行迭代;讀取根節點下的所有節點和子節點下的所有節點
- for (Iterator i = root.elementIterator(); i.hasNext();) {
- Element element = (Element) i.next();
- System.out.println(element.getName());
- for (Iterator j = element.elementIterator(); j.hasNext();) {
- System.out.println(((Element) j.next()).getName());
- }
- }
- //讀取節點名為foo的所有子節點
- for (Iterator i = root.elementIterator("foo"); i.hasNext();) {
- Element foo = (Element) i.next();
- System.out.println(foo.getName());
- }
- //讀取根節點的所有屬性
- for (Iterator i = root.attributeIterator(); i.hasNext();) {
- Attribute attribute = (Attribute) i.next();
- System.out.println(attribute.getName());
- }
- }
- /*
- * 可以根據節點名字讀取節點,也可以讀取節點裡的key和value
- */
- publicvoid readNodes(Document document) {
- List list = document.selectNodes( "//foo/bar" ); //foo為根節點,獲得根節點下的bar節點
- Node node = document.selectSingleNode( "//foo/bar/author" ); //獲得名為author的第一 節點
- String name = node.valueOf( "@name" ); //獲得節點名屬性名為name的value
- }
- /*
- * 如果xml檔案很大的情況下,用上面的方法很費時,這樣 可以用遞迴遍歷整個xml檔案
- */
- publicvoid treeWalk(Document document) {
- treeWalk(document.getRootElement());
- }
- /*
- * 遞迴呼叫,傳遞每一個父節點做為引數
- */
- publicvoid treeWalk(Element element) {
- for (int i = 0, size = element.nodeCount(); i < size; i++) {
- Node node = element.node(i);
- if (node instanceof Element) {//如果node實現了Element介面,那麼就表示node是一個節點。再遞迴
- treeWalk((Element) node);
- System.out.println(((Element) node).getName()+":"+node.valueOf("@name"));
- } else {//如果沒有實現Element介面,那麼就表示這個node不是節點了,輸出節點等操作;
- }
- }