DOM4J是一套简单的,灵活的,基于DOM技术的,用于解析xml的开源框架。他提供了一系列用于解析,操作xml的方法,我们可以从http://sourceforge.net/projects/dom4j上下载最新版的dom4j-1.6.1,下载后将其解压,有如下的目录结构,
其中,docs目录下是dom4j-1.6.1的api文档,src下是dom4j-1.6.1的源码,dom4j-1.6.1.jar是我们需要的jar包,里面包含了dom4j一系列供我们使用的内容。
在我们打开docs目录下的index.html文件时,网页左侧的Quick Start 可以帮助我们对快速上手dom4j。
一.dom4j的使用
1.首先我们需要在eclipse中创建我们的工程,此处不再详细介绍。
2.右击我们创建的工程,选择Build Path -> Configure Build Path
3.选中Libraries标签,点击Add External JARs...按钮,将我们上面介绍的dom4j-1.6.1.jar添加进来
4.这样一切准备就绪,我们就可以使用dom4j了。
二.创建xml文档
创建xml文档主要是通过dom4j给我们提供的Document对象来实现的,可以通过以下方式获得Document的实例,
Document document = DocumentHelper.createDocument();
DocumentHelper相当于Document的工厂类,阅读源码我们会发现,DocumentHelper.createDocument();其实调用的是DocumentFactory.getInstance();
获取到document的实例后,我们可以通过document.addComment, document.addElement(), document.addAttribute等操作来为xml添加注释,节点,属性等内容
我们以创建这段xml文本内容为例:
<catalog>
<!--An XML Catalog-->
<journal title="XML Zone"
publisher="IBM developerWorks">
<article level="Intermediate" date="December-2001">
<title>Java configuration with XML Schema</title>
<author>
<firstname>Marcello</firstname>
<lastname>Vitaletti</lastname>
</author>
</article>
</journal>
</catalog>
他的实现代码如下所示:
Document document = DocumentHelper.createDocument();
Element rootElement = document.addElement("catalog");
//添加注释<!-- An XML Catalog -->
rootElement.addComment("An XML Catalog");
//添加journal节点<journal></journal>
Element journalElement = rootElement.addElement("journal");
//为<journal>节点添加属性
journalElement.addAttribute("title", "XML ZONE");
journalElement.addAttribute("publisher", "IBM developerWorks");
Element articleElement = journalElement.addElement("article");
articleElement.addAttribute("level", "Intermediate");
articleElement.addAttribute("date", "December-2001");
Element titleElement = articleElement.addElement("title");
titleElement.setText("Java configuration with XML Schema");
Element authorElement = articleElement.addElement("author");
Element firstnameElement = authorElement.addElement("firstname");
firstnameElement.setText("Marcello");
Element lastnameElement = authorElement.addElement("lastname");
lastnameElement.setText("Vitaletti");
//将document对象转换成String字符串
String str = document.asXML();
System.out.println(str);
try {
/*
* 将document写入指定的文件catagory.xml
*/
XMLWriter writer = new XMLWriter(new FileWriter("catagory.xml"));
writer.write(document);
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
三.遍历xml文本,即属性更改
要遍历xml文本,必须要读取,并解析xml文本的内容,我们可以通过如下方式,将xml文本实例化成一个Document对象,并将document对象中的内容遍历,打印各个节点的名字与属性。代码如下:
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("catagory.xml"));
//获取根节点
Element rootElement = document.getRootElement();
System.out.println(rootElement.getName()); //
for(Iterator iterator = rootElement.elementIterator(); iterator.hasNext(); ){
//获取到journal节点
Element element = (Element)iterator.next();
System.out.println(element.getName()); //
if(element.getName().equals("journal")){
Attribute attr_title = element.attribute("title");
System.out.println(attr_title.getName() + " === " + attr_title.getValue());
Attribute attr_publisher = element.attribute("publisher");
System.out.println(attr_publisher.getName() + " === " + attr_publisher.getValue());
for(Iterator iter = element.elementIterator(); iter.hasNext(); ){
//获取到article节点
Element element2 = (Element)iter.next();
System.out.println(element2.getName()); //
if(element2.getName().equals("article")){
Attribute attr_level = element2.attribute("level");
System.out.println(attr_level.getName() + " === " + attr_level.getValue());
Attribute attr_date = element2.attribute("date");
System.out.println(attr_date.getName() + " === " + attr_date.getValue());
}
for(Iterator iter2 = element2.elementIterator(); iter2.hasNext(); ){
Element element3 = (Element)iter2.next();
System.out.println(element3.getName()); //
if(element3.getName().equals("title")){
//获取到title节点
System.out.println(element3.getText());
}else if(element3.getName().equals("author")){
//获取到author节点
System.out.println(element3.element("firstname").getName() + " --- " + element3.element("firstname").getText());
System.out.println(element3.element("lastname").getName() + " --- " + element3.element("lastname").getText());
}
}
}
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
他的运行结果如下,我们可以在获取到某个Element后通过set方法更改相关的值