一、简介

Dom4j是一个开源的处理XML文件的软件,其使用简单、功能强大、性能优异,Sun和Hibernate等都使用它来读/写XML配置文件。

Dom4j是早期由开发JDOM的人分离出来独立开发的,与JDOM不同的是:Dom4j使用接口的抽象基类,虽然API相对复杂一些,但更灵活。

Dom4j也使用SAX解析器来分析XML文件,创建Dom4j树。Dom4j也接收DOM格式的内容,并提供从Dom4j树SAX事件流或W3C DOM树的转换。

二、使用

1、下载dom4j.jar

下载dom4j-1.6.1.jar

2、解析XML文件

  • depts.xml
<?xml version="1.0" encoding="UTF-8"?>
<depts>
	<dept id="101">
		<name>人历资源部</name>
		<number>HR</number>
		<description>人力资源部是对企业中各类人员进行管理的部门。</description>
	</dept>
</depts>
  • 解析单个

只解析首个dept元素:

//获取解析对象
SAXReader parser = new SAXReader();
try{
	//获取Document对象
	Document doc = parser.read(new File("src/depts.xml"));
	//获取根元素
	Element root = doc.getRootElement();
	String rootName = root.getName();
	System.out.println("root: " + rootName);

	//获取dept元素
	Element elt = root.element("dept");
	System.out.println("root-child: " + elt.getName());
	//获取dept元素的id属性
	Attribute idAttr = elt.attribute("id");
	System.out.println(idAttr.getName() + ": " + idAttr.getValue());

	//获取dept的name子元素
	Element deptName = elt.element("name");
	System.out.println(deptName.getName() + ": " + deptName.getText());
	//获取dept的number子元素
	Element deptNumber = elt.element("number");
	System.out.println(deptNumber.getName() + ": " + deptNumber.getText());
	//获取dept的description子元素
	Element deptDesc = elt.element("description");
	System.out.println(deptDesc.getName() + ": " + deptDesc.getText());

}catch(Exception e){
	e.printStackTrace();
}

运行结果:

root: depts
root-child: dept
id: 101
name: 人历资源部
number: HR
description: 人力资源部是对企业中各类人员进行管理的部门。
  • 解析多个

通用的解析方式:

//获取解析对象
SAXReader parser = new SAXReader();
try{
	//获取Document对象
	Document doc = parser.read(new File("src/depts.xml"));
	//获取根元素
	Element root = doc.getRootElement();
	String rootName = root.getName();
	System.out.println(rootName);

	//获取根元素的子元素
	List<Element> elements = root.elements();
	for(Element e : elements){
		String name = e.getName();
		System.out.println("    " + name);
		
		//获取子元素的属性
		List<Attribute> attrs = e.attributes();
		for(Attribute attr : attrs){
			//属性名
			String attrName = attr.getName();
			//属性值
			String attrValue = attr.getValue();
			System.out.println("        " + attrName + ": " + attrValue);
		}
		
		//获取孙子元素
		Iterator<Element> iter = e.elementIterator();
		while(iter.hasNext()){
			Element elm = iter.next();
			String ename = elm.getName();
			String etext = elm.getText();
			System.out.println("        " + ename + ": " + etext);
		}
	}
}catch(Exception e){
	e.printStackTrace();
}

运行结果:

depts
    dept
        id: 101
        name: 人历资源部
        number: HR
        description: 人力资源部是对企业中各类人员进行管理的部门。

3、使用XPath

Dom4j对XPath有良好的支持,使用XPath依赖于jaxen.jar。

SAXReader parser = new SAXReader();
try{
	Document document = parser.read(new File("src/depts.xml"));
	List list = document.selectNodes("/depts/dept/name");
	System.out.println(list.size() + ": " + ((Node)list.get(0)).asXML());
	
	Node node = document.selectSingleNode("/depts/dept");
	System.out.println(node.asXML());
	String id = node.valueOf("@id");
	System.out.println("id: " + id);
	
	Node idNode = document.selectSingleNode("/depts/dept/@id");
	System.out.println(idNode.asXML() + ": " + idNode.getStringValue());
}catch(Exception e){
	e.printStackTrace();
}

运行结果:

1: <name>人历资源部</name>
<dept id="101">
	<name>人历资源部</name>
	<number>HR</number>
	<description>人力资源部是对企业中各类人员进行管理的部门。</description>
</dept>
id: 101
id="101": 101

4、创建XML文件

  • 常用方法

    • DocumentFactory.createDocument()

    创建Document对象:

      DocumentFactory factory = new DocumentFactory();
      Document doc = factory.createDocument();
    
    • Element.addElement()

    为父元素添加子元素

    • Element.addAttribute()

    为元素添加属性

    • Element.createCopy()

    复制一个元素

    • Node.setText()

    设置元素的内容

    • Node.asXML()

    将元素转换为XML字符串

  • 创建XML文件示例

//创建Document对象
Document doc = DocumentHelper.createDocument();
//创建处理指令
//doc.addProcessingInstruction("xml-stylesheet", "type='text/xsl' href=user.xsl");

//创建根元素
Element root = DocumentHelper.createElement("users");
doc.setRootElement(root);
//创建子元素user
Element user = root.addElement("user");
//设置注释
user.addComment("注释: 人员信息");
//创建user的name子元素
Element name = user.addElement("name");
//创建user的password子元素
Element password = user.addElement("password");
//设置name和password元素的文本结点值
name.setText("Tom");
password.setText("666666");

try{
	//OutputFormat format = new OutputFormat("    ", true);
	//OutputFormat format = OutputFormat.createPrettyPrint();
	//输出
	OutputFormat format = new OutputFormat();
	//字符编码
	format.setEncoding("GBK");//中文
	//缩进
	format.setIndent(true);
	format.setIndent("    ");
	//换行输出
	format.setNewlines(true);
	//不生成<?xml version="1.0" encoding="xxx"?>
	format.setSuppressDeclaration(true);

	//输出流
	OutputStream os = new FileOutputStream("G:/users.xml");
	XMLWriter writer = new XMLWriter(os, format);
	writer.write(doc);
	writer.close();
	os.close();
}catch(IOException e){
	e.printStackTrace();
}

运行结果(users.xml):

<users>
    <user>
        <!--注释: 人员信息-->
        <name>Tom</name>
        <password>666666</password>
    </user>
</users>
附:

dom4j

Maven Repository: Dom4j

Maven Repository: Jaxen