xml文件的dom4j解析


     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);
		}
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章