DOM4j是一個(gè)易用的,開(kāi)源的JAVA操作XML的API,寫(xiě)過(guò)一篇4種XML操作API的比較,DOM4j是性能和易用行最佳的。因此做一個(gè)小教程,供初學(xué)者學(xué)習(xí)。
學(xué)習(xí)DOM4j首先就先來(lái)了解下它主要的包
DOM4j所有的接口都在org.dom4j這個(gè)包里定義著
org.dom4j.Attribute : Attribute接口定義了XML文件的屬性
org.dom4j.Branch : Branch為能夠包含子節(jié)點(diǎn)的節(jié)點(diǎn)如XML元素和文檔定義了一個(gè)公共行為
org.dom4j.CDATA : CDATA定義了XML CDATA區(qū)域
org.dom4j.CharacterData: CharacterData是一個(gè)標(biāo)識(shí)接口,標(biāo)識(shí)基于字符的節(jié)點(diǎn)。
org.dom4j.Comment : Comment定義了XML注釋的行為
org.dom4j.Document : Docement接口定義了XML文檔
org.dom4j.Element : Element定義了XML元素
org.dom4j.ElementHandler: ElementHandler定義了Element對(duì)象的處理器
org.dom4j.ElementPath : 被ElementHandler使用,用于取得當(dāng)前正在處理的路徑層次信息
org.dom4j.Entity : Entity定義XML entity
org.dom4j.Node : Node為所有的dom4j中XML節(jié)點(diǎn)定義了多態(tài)行為
org.dom4j.NodeFilter : NodeFilter定義了在dom4j節(jié)點(diǎn)中產(chǎn)生的一個(gè)濾鏡或謂詞的行為
org.dom4j.ProcessingInstruction : ProcessingInstruction定義XML處理指令
org.dom4j.Text : Test定義了XML文本節(jié)點(diǎn)
org.dom4j.Visitor : Visitor用于實(shí)現(xiàn)Visitor模式
org.dom4j.XPath : XPath在分析一個(gè)字符串后會(huì)提供一個(gè)XPath表達(dá)式
下面說(shuō)下主要的實(shí)用方法
1: 讀取并解析XML文檔:
讀寫(xiě)XML文檔主要依賴(lài)于org.dom4j.io包,提供了DOMReader和SAXReader兩類(lèi)不同方式,調(diào)用方式一樣。
// 從文件讀取XML,輸入文件名,返回XML文檔
public Document read(String fileName) throws MalformedURLException, DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
return document;
}
2:取得ROOT節(jié)點(diǎn)
如果要讀取一個(gè)XML文件,最重要的就是要讀取ROOT節(jié)點(diǎn)了,一切分析XML都是從ROOT節(jié)點(diǎn)開(kāi)始。
public Element getRootElement(Document doc){
return doc.getRootElement();
}
3:遍歷XML樹(shù),這里有二種方法
(1): 枚舉
// 枚舉所有子節(jié)點(diǎn)
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
// do something
}
// 枚舉名稱(chēng)為foo的節(jié)點(diǎn)
for ( Iterator i = root.elementIterator(foo); i.hasNext();) {
Element foo = (Element) i.next();
// do something
}
// 枚舉屬性
for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}
(2) : 遞歸
public void treeWalk() {
treeWalk(getRootElement());
}
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 { // do something....
}
}
}
4:字符串與XML的轉(zhuǎn)換
// XML轉(zhuǎn)字符串
Document document = ...;
String text = document.asXML();
// 字符串轉(zhuǎn)XML
String text = <person> <name>James</name> </person>;
Document document = DocumentHelper.parseText(text);
5. 創(chuàng)建XML
這里創(chuàng)建一個(gè)XML,沒(méi)有寫(xiě)
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement(root);
Element author1 =
root
.addElement(author)
.addAttribute(name, James)
.addAttribute(location, UK)
.addText(James Strachan);
Element author2 =
root
.addElement(author)
.addAttribute(name, Bob)
.addAttribute(location, US)
.addText(Bob McWhirter);
return document;
}
6: XML 文件輸出
FileWriter out =
new FileWriter( foo.xml );
document.write(out);
DOM4j 的簡(jiǎn)單常用的方法上面總結(jié)了下,大家可以有一個(gè)印象,想要學(xué)的仔細(xì)了就要自己好好研究了,下面有一個(gè)以前寫(xiě)的小程序,實(shí)現(xiàn)了創(chuàng)建和編輯XML文件的功能。
package com.dom4j.test;
import java.io.File;
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.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class NewXML {
/**
*
* 用DOM4J創(chuàng)建一個(gè)XML文件
* @param args
*/
public boolean newXMl(String fileName){
boolean returnValue=false;
//定義一個(gè)XML文檔
Document docement=DocumentHelper.createDocument();
//設(shè)置XML文檔的元素
Element rootElement=docement.addElement("DOM4J創(chuàng)建XML文檔");
rootElement.addComment("鏡花水月2007-4-24晚上創(chuàng)建");
Element nameElement=rootElement.addElement("鏡花水月");
nameElement.addAttribute("名字","不告訴你");
Element schoolElement=nameElement.addElement("學(xué)校");
schoolElement.setText("西安翻譯學(xué)院");
Element cityElement=rootElement.addElement("城市");
cityElement.setText("上海");
Element homeElement=cityElement.addElement("住址");
homeElement.setText("徐家匯");
//創(chuàng)建XML文檔
try {
/** 格式化輸出,類(lèi)型IE瀏覽一樣 */
OutputFormat format = OutputFormat.createPrettyPrint();
/** 指定XML編碼 */
format.setEncoding("GBK");
XMLWriter writer=new XMLWriter(new FileWriter(new File(fileName)),format);
writer.write(docement);
writer.close();
return returnValue=true;
} catch (IOException e) {
e.printStackTrace();
}
return returnValue;
}
/**
*
* 用DOM4J修改一個(gè)XML文件
* @param args
*
*/
public boolean update(String fileName,String newFileName){
boolean returnValaue=false;
SAXReader reader=new SAXReader();
try {
Document docement=reader.read(new File(fileName));
List list=null;
list=docement.selectNodes("/DOM4J創(chuàng)建XML文檔/鏡花水月/@名字");
Iterator it=list.iterator();
while(it.hasNext()){
Attribute attribute=(Attribute) it.next();
if(attribute.getValue().equals("不告訴你")){
attribute.setValue("還是不告訴你");
}
}
//將就該寫(xiě)入新的文件
try {
//轉(zhuǎn)碼
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
XMLWriter writer=new XMLWriter(new FileWriter(new File(newFileName)),format);
writer.write(docement);
writer.close();
return returnValaue=true;
} catch (IOException e) {
e.printStackTrace();
}
} catch (DocumentException e) {
e.printStackTrace();
}
return returnValaue;
}
public static void main(String[] args) {
NewXML newXml=new NewXML();
String name="newXML.xml";
String newName="UpdateXML.xml";
if(!newXml.newXMl(name)){
System.out.println("創(chuàng)建出現(xiàn)錯(cuò)誤!");
return ;
}else{
System.out.println("創(chuàng)建XML成功!");
}
if(!newXml.update(name,newName)){
System.out.println("修改出現(xiàn)錯(cuò)誤!");
return;
}else{
System.out.println("修改XML成功");
}
}
}