Dom4j简介
一、简介
Dom4j是一个开源的处理XML文件的软件,其使用简单、功能强大、性能优异,Sun和Hibernate等都使用它来读/写XML配置文件。
Dom4j是早期由开发JDOM的人分离出来独立开发的,与JDOM不同的是:Dom4j使用接口的抽象基类,虽然API相对复杂一些,但更灵活。
Dom4j也使用SAX解析器来分析XML文件,创建Dom4j树。Dom4j也接收DOM格式的内容,并提供从Dom4j树SAX事件流或W3C DOM树的转换。
二、使用
1、下载dom4j.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>