dom4j的官方地址:http://www.
dom4j.org
dom4j是一個(gè)成功的開(kāi)源項(xiàng)目,從java的對(duì)象概念的角度出發(fā),按照通常的使用規(guī)范來(lái)處理xml文檔,可以說(shuō),在java社區(qū)里,
dom4j使用的最為廣泛了,以下是如,眾所周知的o/r mapping工具h(yuǎn)ibernate就是使用
dom4j來(lái)解釋xml文檔的(ejb3.0就是基于hibernate實(shí)現(xiàn)的),由此可見(jiàn),
dom4j的使用廣泛之處。
dom4j的一個(gè)最大的實(shí)用之處是支持XPath表達(dá)式的查詢(xún),這樣,我們可以在
dom4j的Document結(jié)構(gòu)中使用這種簡(jiǎn)單的表達(dá)式就可以快速找到我們需要的某個(gè)元素了。
- package com.gdapp.oa.app;
-
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.Iterator;
-
- 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;
-
-
-
-
-
-
- public class Dom4jAPP
- {
-
-
-
-
- public void writeXML(String path)
- {
- try
- {
- FileWriter out = new FileWriter(path);
- Document doc = createDocument();
- write(doc,path);
- } catch (IOException e)
- {
-
- e.printStackTrace();
- }
- }
-
-
-
-
-
-
- public Document readXML(String path)
- {
- Document doc = null;
- try
- {
- SAXReader reader = new SAXReader();
- doc = reader.read(path);
-
- } catch (DocumentException e)
- {
-
- e.printStackTrace();
- }
- return doc;
- }
-
-
- public void displayXML(String path)
- {
- Document doc = readXML(path);
- Element root = doc.getRootElement();
-
- for(Iterator it = root.elementIterator();it.hasNext();)
- {
- Element e = (Element)it.next();
- System.out.println("【內(nèi)容=="+e.getText()+"】【 enjoy屬性=="+e.attributeValue("enjoy")+"】");
- }
-
-
- for ( Iterator i = root.elementIterator("bicashy"); i.hasNext();) {
- Element foo = (Element) i.next();
- System.out.println("【內(nèi)容=="+foo.getText()+"】【 enjoy屬性=="+foo.attributeValue("enjoy")+"】");
- }
-
-
- Element bicashy = root.element("bicashy");
- for ( Iterator i = bicashy.attributeIterator(); i.hasNext(); ) {
- Attribute attribute = (Attribute) i.next();
- System.out.println("屬性"+attribute.getName()+"=="+attribute.getText());
- }
-
-
- Element child = root.element("parent").element("child");
- for ( Iterator i = child.attributeIterator(); i.hasNext(); ) {
- Attribute attribute = (Attribute) i.next();
- System.out.println("屬性"+attribute.getName()+"=="+attribute.getText());
- }
- }
-
-
- public void modifyXML(String path)
- {
- try
- {
- SAXReader reader = new SAXReader();
- Document doc = reader.read(path);
- Element root = doc.getRootElement();
- Element child = root.element("parent").element("child");
- for ( Iterator i = child.attributeIterator(); i.hasNext(); )
- {
- Attribute attribute = (Attribute) i.next();
- if(attribute.getName().equals("姓名"))
- {
- attribute.setText("金剛");
- }
- }
- child.setText("我是誰(shuí)?");
- write(doc,path);
-
- } catch (DocumentException e)
- {
-
- e.printStackTrace();
- }
- }
-
-
- public void treeWalk(String path)
- {
- Document doc = readXML(path);
- Element root = doc.getRootElement();
- treeWalk(root);
- }
-
- public void treeWalk(Element element)
- {
- for (int i = 0, size = element.nodeCount(); i < size; i++) {
- Node node = element.node(i);
- if (node instanceof Element) {
- treeWalk((Element) node);
- } else
- {
- System.out.println("##"+"=="+node.getText());
- }
- }
- }
-
-
-
-
-
-
- public void write(Document doc,String outpath)
- {
- XMLWriter writer = null;
- try
- {
- writer = new XMLWriter(new FileOutputStream(new File(outpath)));
- writer.write(doc);
- writer.close();
-
-
- OutputFormat format = OutputFormat.createPrettyPrint();
- format.setEncoding("GBK");
- writer = new XMLWriter(System.out,format );
- writer.write(doc);
-
-
-
-
- } catch (Exception e)
- {
-
- e.printStackTrace();
- }
- }
-
-
-
-
-
-
-
-
-
-
-
- public Document createDocument()
- {
- Document document = DocumentHelper.createDocument();
- Element root = document.addElement("root");
-
- Element bicashy1 =
- root.addElement("bicashy")
- .addAttribute("name", "wangpengfei")
- .addAttribute("sex","male")
- .addAttribute("enjoy", "computer")
- .addText("Best of you");
- Element bicashy2 =
- root.addElement("ladybird")
- .addAttribute("name", "dibowey")
- .addAttribute("sex","male")
- .addAttribute("enjoy", "muder")
- .addText("III kill");
- Element bicashy3 =
- root.addElement("parent");
- Element bicashy4 =
- bicashy3.addElement("child")
- .addAttribute("姓名", "毛孩")
- .addAttribute("乳名","小屁孩")
- .addText("WHO AM I?");
- return document;
- }
-
- public static void main(String[] args)
- {
- Dom4jAPP app = new Dom4jAPP();
- app.writeXML("e:/bicashy.xml");
- app.displayXML("e:/bicashy.xml");
-
- }
- }
package com.gdapp.oa.app;import java.io.File;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.util.Iterator;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;/*** 對(duì)dom4j的操作,添加,修改,顯示* @author bicashy**/public class Dom4jAPP{/*** 寫(xiě)XML文件* @param path*/public void writeXML(String path){try{FileWriter out = new FileWriter(path);Document doc = createDocument();write(doc,path);} catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}}/*** 返回Document對(duì)象* @param path* @return*/public Document readXML(String path){Document doc = null;try{SAXReader reader = new SAXReader();doc = reader.read(path);} catch (DocumentException e){// TODO Auto-generated catch blocke.printStackTrace();}return doc;}public void displayXML(String path){Document doc = readXML(path);Element root = doc.getRootElement();for(Iterator it = root.elementIterator();it.hasNext();){Element e = (Element)it.next();System.out.println("【內(nèi)容=="+e.getText()+"】【 enjoy屬性=="+e.attributeValue("enjoy")+"】");}//枚舉名稱(chēng)為"bicashy"的節(jié)點(diǎn)for ( Iterator i = root.elementIterator("bicashy"); i.hasNext();) {Element foo = (Element) i.next();System.out.println("【內(nèi)容=="+foo.getText()+"】【 enjoy屬性=="+foo.attributeValue("enjoy")+"】");}// 枚舉"bicashy"節(jié)點(diǎn)下的屬性Element bicashy = root.element("bicashy");for ( Iterator i = bicashy.attributeIterator(); i.hasNext(); ) {Attribute attribute = (Attribute) i.next();System.out.println("屬性"+attribute.getName()+"=="+attribute.getText());}//枚舉"child"節(jié)點(diǎn)下的屬性Element child = root.element("parent").element("child");for ( Iterator i = child.attributeIterator(); i.hasNext(); ) {Attribute attribute = (Attribute) i.next();System.out.println("屬性"+attribute.getName()+"=="+attribute.getText());}}//修改xml文件(將“child”節(jié)點(diǎn)的屬性“姓名”的值改為 “金剛”,將內(nèi)容改為“我是誰(shuí)?”)public void modifyXML(String path){try{SAXReader reader = new SAXReader();Document doc = reader.read(path);Element root = doc.getRootElement();Element child = root.element("parent").element("child");for ( Iterator i = child.attributeIterator(); i.hasNext(); ){Attribute attribute = (Attribute) i.next();if(attribute.getName().equals("姓名")){attribute.setText("金剛");}}child.setText("我是誰(shuí)?");write(doc,path);} catch (DocumentException e){// TODO Auto-generated catch blocke.printStackTrace();}}//遞歸public void treeWalk(String path){Document doc = readXML(path);Element root = doc.getRootElement();treeWalk(root);}public void treeWalk(Element element){for (int i = 0, size = element.nodeCount(); i < size; i++) {Node node = element.node(i);if (node instanceof Element) {treeWalk((Element) node);} else{System.out.println("##"+"=="+node.getText());}}}/*** 寫(xiě)入文件* @param doc 文檔對(duì)象* @param outpath 文件路徑*/public void write(Document doc,String outpath){XMLWriter writer = null;try{writer = new XMLWriter(new FileOutputStream(new File(outpath)));writer.write(doc);writer.close();//美化格式(優(yōu)美格式)OutputFormat format = OutputFormat.createPrettyPrint();// 定義文檔的格式為美化型(pretty)format.setEncoding("GBK");// 格式編碼為“gbk”writer = new XMLWriter(System.out,format );writer.write(doc);//縮進(jìn)格式// format = OutputFormat.createCompactFormat();// writer = new XMLWriter(System.out,format);// writer.write(doc);} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}}/*<?xml version="1.0" encoding="GBK"?><root><bicashy name="wangpengfei" sex="male" enjoy="computer">Best of you</bicashy><ladybird name="dibowey" sex="male" enjoy="muder">III kill</ladybird><parent><child 姓名="毛孩" 乳名="小屁孩">WHO AM I?</child></parent></root>*/public Document createDocument(){Document document = DocumentHelper.createDocument();Element root = document.addElement("root");Element bicashy1 =root.addElement("bicashy").addAttribute("name", "wangpengfei").addAttribute("sex","male").addAttribute("enjoy", "computer").addText("Best of you");Element bicashy2 =root.addElement("ladybird").addAttribute("name", "dibowey").addAttribute("sex","male").addAttribute("enjoy", "muder").addText("III kill");Element bicashy3 =root.addElement("parent");Element bicashy4 =bicashy3.addElement("child").addAttribute("姓名", "毛孩").addAttribute("乳名","小屁孩").addText("WHO AM I?");return document;}public static void main(String[] args){Dom4jAPP app = new Dom4jAPP();app.writeXML("e:/bicashy.xml");app.displayXML("e:/bicashy.xml");//app.modifyXML("e:/bicashy.xml");}}
dom4j是基于面向接口的樣式來(lái)實(shí)現(xiàn)處理xml文檔的,這種方法在面向?qū)ο蟮念I(lǐng)域里特別常見(jiàn)。使用的常用接口都封裝在org.
dom4j包里,而怎樣讀取xml文檔呢?則是使用一系列的api函數(shù),這些常用方法都封裝在org.
dom4j.io。
(1)從面向?qū)ο蟮慕嵌葋?lái)看,
dom4j對(duì)XML的文檔結(jié)構(gòu)進(jìn)行了封裝,從一個(gè)文檔的角度來(lái)說(shuō)(我們不考慮內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)的話(huà)),可以簡(jiǎn)單的把一個(gè)XML文檔就當(dāng)做一個(gè)org.
dom4j.Document:
我們現(xiàn)在使用
dom4j的Document結(jié)構(gòu),而不是使用w3c的Document結(jié)構(gòu),讀取一個(gè)文件,在內(nèi)存中構(gòu)造一個(gè)Document結(jié)構(gòu):Document doc=new SAXReader().read(new File("...")); 就可以獲得一個(gè)Document結(jié)構(gòu)。注意,
dom4j同時(shí)也對(duì)w3c的Document結(jié)構(gòu),SAX Event的支持,具體的使用可以參看docs/cookbook.html中的內(nèi)容。這里不一一介紹。
(2)獲得一個(gè)
dom4j的Document結(jié)構(gòu)之后,從面向?qū)ο蟮慕嵌?,我們自然而然的想起的是XML中的
element,
dom4j根據(jù)這種想法對(duì)這些進(jìn)行了封裝org.
dom4j.
Element類(lèi)就是對(duì)這些進(jìn)行了封裝,從Document中獲得
Element:
首先獲得一個(gè)root元素,
Element root=doc.getRootElement();而其他的元素也可以根據(jù)這個(gè)root元素來(lái)獲得。
(4)一個(gè)元素的屬性的話(huà),則是Attribute,在
Element類(lèi)中,有非常容易操作的方法添加于獲得Attribute,addAttritue();attribute()等函數(shù)原型都提供了操作。
(5)
dom4j同時(shí)也提供了在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)的構(gòu)造,不降低處理的靈活性。如:Node就是對(duì)一個(gè)xml文檔樹(shù)的節(jié)點(diǎn)的封裝,而B(niǎo)ranch則是對(duì)一個(gè)樹(shù)的分支的封裝,通過(guò)使用這些,可以靈活的按照樹(shù)的結(jié)構(gòu)來(lái)處理xml文檔。敏感的朋友可能會(huì)注意到,Document和
Element都是Node與Branch的子類(lèi),這種不同功能的領(lǐng)域的封裝可以按照對(duì)象的處理與數(shù)據(jù)結(jié)構(gòu)的結(jié)合,靈活的處理xml文檔。