dom4j解析xml文件,不用多说,这确实是一个非常优秀的解析xml的api。dom4j可以说在性能、功能上独树一帜,而且它同Jdom一样,有着简单易用的特性。
说起dom4j的渊源,从名字上也让人觉得它跟Jdom有什么瓜葛,确实如此。这个团队本来都是本着开发一个更为简单易用的xml解析工具,可是后来团队中有不同的意见,于是一部人带着他们的思想,一起开发了dom4j。两个不同的思想,竞争起来当然使得团队要不惜一切的开发好产品。所以说Jdom与Dom4j都是很优秀的xml解析api。
不过,总的来说,Dom4j相对来说比较受青睐,它具备了
极为强大的解析能力,且支持XPath,越来越多的软件中都使用dom4j来作为xml的解析。
使用dom4j要使用到其提供的api,可从
http://sourceforge.net/projects/dom4j/files/latest/download下载,
dom4j的开发包中包含一些第三方开发包,当调用dom4j某些功能需要添加相应的开发包,大部分情况下,在项目中导入基本的dom4j.jar即可。
下面是一个要解析的person.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="328">
<name>zhangsan</name>
<age>23</age>
</person>
<person id="303">
<name>lisi</name>
<age>22</age>
</person>
</persons>
将解析后的数据封装在Person类中,类如下:
public class Person {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
super();
}
}
导入dom4j.jar,使用Dom4j对person.xml进行解析,注意导正确的包,以免不必要的错误:
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4JTest {
public static void main(String[] args) {
try {
//取得dom4j的解析器
SAXReader reader = new SAXReader();
//获取xml文件的输入流
InputStream inStream = Dom4JTest.class.getClassLoader()
.getResourceAsStream("person.xml");
//取得代表文档的Document对象
Document document = reader.read(inStream);
//取得根结点
Element root = document.getRootElement();
ArrayList<Person> persons = new ArrayList<Person>();
Person person = null;
//取得根节点的子结点,并进行遍历取出数据,封装在Person中
List list = root.elements();
for (int i = 0, size = list.size(); i < size; i++) {
person = new Person();
//或取第一个子结点<person>
Element e = (Element) list.get(i);
//获取属性id
String id = e.attributeValue("id");
person.setId(Integer.valueOf(id));
//遍历<person>的子结点,以便取出数据。
List ce = e.elements();
for (int j = 0, csize = ce.size(); j < csize; j++) {
Element tempE = (Element) ce.get(j);
String qName = tempE.getName();
//根据结点的名称,将数据封装于Person类的对象中。
switch (qName) {
case "name":
String name = tempE.getText();
person.setName(name);
break;
case "age":
String age = tempE.getText();
person.setAge(Integer.valueOf(age));
break;
}
}
//结束一轮<person>结点的遍历,将person对象存入集合,并清空。
persons.add(person);
person = null;
}
//打印集合。
printList(persons);
} catch (DocumentException e) {
e.printStackTrace();
}
}
//打印集合。
public static void printList(ArrayList<Person> persons) {
for (Person p : persons) {
System.out.println(p);
}
}
}