DOM4j是一个易用的,开源的JAVA操作XML的API,写过一篇4种XML操作API的比较,DOM4j是性能和易用行最佳的。因此做一个小教程,供初学者学习。
学习DOM4j首先就先来了解下它主要的包
DOM4j所有的接口都在org.dom4j这个包里定义着
org.dom4j.Attribute : Attribute接口定义了XML文件的属性
org.dom4j.Branch : Branch为能够包含子节点的节点如XML元素和文档定义了一个公共行为
org.dom4j.CDATA : CDATA定义了XML CDATA区域
org.dom4j.CharacterData: CharacterData是一个标识接口,标识基于字符的节点。
org.dom4j.Comment : Comment定义了XML注释的行为
org.dom4j.Document : Docement接口定义了XML文档
org.dom4j.Element : Element定义了XML元素
org.dom4j.ElementHandler: ElementHandler定义了Element对象的处理器
org.dom4j.ElementPath : 被ElementHandler使用,用于取得当前正在处理的路径层次信息
org.dom4j.Entity : Entity定义XML entity
org.dom4j.Node : Node为所有的dom4j中XML节点定义了多态行为
org.dom4j.NodeFilter : NodeFilter定义了在dom4j节点中产生的一个滤镜或谓词的行为
org.dom4j.ProcessingInstruction : ProcessingInstruction定义XML处理指令
org.dom4j.Text : Test定义了XML文本节点
org.dom4j.Visitor : Visitor用于实现Visitor模式
org.dom4j.XPath : XPath在分析一个字符串后会提供一个XPath表达式
下面说下主要的实用方法
1: 读取并解析XML文档:
读写XML文档主要依赖于org.dom4j.io包,提供了DOMReader和SAXReader两类不同方式,调用方式一样。
// 从文件读取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节点
如果要读取一个XML文件,最重要的就是要读取ROOT节点了,一切分析XML都是从ROOT节点开始。
public Element getRootElement(Document doc){
return doc.getRootElement();
}
3:遍历XML树,这里有二种方法
(1): 枚举
// 枚举所有子节点
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
// do something
}
// 枚举名称为foo的节点
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的转换
// XML转字符串
Document document = ...;
String text = document.asXML();
// 字符串转XML
String text = <person></person> <name></name>James ;
Document document = DocumentHelper.parseText(text);
5. 创建XML
这里创建一个XML,没有写
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 的简单常用的方法上面总结了下,大家可以有一个印象,想要学的仔细了就要自己好好研究了,下面有一个以前写的小程序,实现了对XML的增删改查的功能。
import jbolt.framework.dmm.metas.JBoltModuleMeta;
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;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
public class TestDom4j {
private Document document;
public TestDom4j(String fileName) {
SAXReader reader = new SAXReader();
try {
document = reader.read(new File(fileName));
} catch (DocumentException e) {
e.printStackTrace();
}
}
public void create(String filename) {
document = DocumentHelper.createDocument();
Element booksElement = document.addElement("dates");
booksElement.addComment("This is a test workDate, 2004.11.18");
Element bookElement = booksElement.addElement("workday");
Element titleElement = bookElement.addElement("day");
titleElement.addAttribute("flag", "yes");
titleElement.setText("2004-11-16");
writeXML(filename);
}
public boolean insert(JBoltModuleMeta moduleMeta) {
Element root = document.getRootElement();
Element moduleName = root.addElement("Module");
moduleName.addAttribute("moduleName", moduleMeta.getModuleName());
moduleName.addAttribute("groupName", moduleMeta.getGroupName());
moduleName.addAttribute("iconName", moduleMeta.getIconName());
moduleName.addAttribute("compPackageName", moduleMeta.getCompPackageName());
return true;
}
public boolean delete(JBoltModuleMeta moduleMeta) {
Element root = document.getRootElement();
List moduleNames = root.elements("Module");
for (Iterator it = moduleNames.iterator(); it.hasNext();) {
Element ele = (Element) it.next();
String moduleName = ele.attributeValue("moduleName");
if (moduleName.equals(moduleMeta.getModuleName())) {
root.remove(ele);
}
}
return true;
}
public void writeXML(String fileName) {
try {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileWriter(new File(fileName)), format);
writer.write(document);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
JBoltModuleMeta moduleMeta = new JBoltModuleMeta();
moduleMeta.setModuleName("aaa");
moduleMeta.setGroupName("bbb");
moduleMeta.setIconName("ccc");
moduleMeta.setCompPackageName("ddd");
TestDom4j test = new TestDom4j("D://rab//Dev//Components//Core//Utilities//src//test//test.xml");
test.insert(moduleMeta);
test.delete(moduleMeta);
test.writeXML("D://rab//Dev//Components//Core//Utilities//src//test//output.xml");
test.create("D://rab//Dev//Components//Core//Utilities//src//test//output2.xml");
}
}
这里的JBoltModuleMeta是个POJO对象,大家随便造个就可以随便修改XML