1. 程式人生 > >java基礎-使用dom4j解析XML檔案

java基礎-使用dom4j解析XML檔案

解析XML

解析過程

     /*

* 解析XML檔案的基本流程
* 1:建立SAXReader,用來讀取XML
*   檔案
* 2:指定xml檔案使得SAXReader讀取,
*   並解析問文件物件Document
* 3:獲取根元素
* 4:獲取每一個元素,從而達到解析的
*   目的。    

*/

程式碼

1.1

用到的輔助類

package demoXml;
/**
 * 該類用於描述emp.xml檔案中表示的員工
 * @author Administrator
 *
 */
public class Emp {
	private int id;
	private String name;
	private int age;
	private String gender;
	private int salary;
	
	public Emp(int id, String name, int age, String gender, int salary) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.salary = salary;
	}
	/**
	 * 無參的構造方法:
	 * 當我們沒有定義構造方法時,編譯器會自動
	 * 幫我們新增一個預設的構造方法。
	 * 預設構造方法:
	 * 無引數,且沒有任何實現程式碼。如下。
	 * 若我們定義過任何構造方法,編譯器不會為
	 * 我們新增該預設構造方法,若需要,則手動
	 * 書寫
	 */
	public Emp(){
		
	}
	
	
	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;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	public String toString(){
		return id+","+name+","+age+","+gender+","+salary;
	}
	
}

1.2

解析程式碼

package demoXml;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 使用DOM解析XML檔案
 * @author Administrator
 *
 */
public class XMLDemo1 {
	public static void main(String []args){
			try{
				/*
				 * 解析XML檔案的基本流程
				 * 1:建立SAXReader,用來讀取XML
				 *   檔案
				 * 2:指定xml檔案使得SAXReader讀取,
				 *   並解析問文件物件Document
				 * 3:獲取根元素
				 * 4:獲取每一個元素,從而達到解析的
				 *   目的。    
				 */
				//1
				//org.dom4j.xxxx
				SAXReader reader
								= new SAXReader();
				
				//2
				/*
				 * 常用的讀取方法
				 * Document read(InputStream in)
				 * Document read(Reader read)
				 * Document read(File file)
				 */
				File xmlFile 
							= new File("emp.xml");
				//2
				/*
				 * read方法的作用:
				 * 讀取給定的xml,並將其解析轉換為
				 * 一個Document物件。
				 * 實際上這裡已經完成了對整個xml
				 * 解析的工作。並將所有內容封裝到了
				 * Document物件中。
				 * Document物件可以描述當前xml文件
				 */
				Document doc 
							= reader.read(xmlFile);
				
				//3
				Element root
							= doc.getRootElement();
				
				//4
				/*
				 * Element element(String name)
				 * 獲取當前標籤下第一個名為給定
				 * 名字的標籤
				 * 
				 * List elements(String name)
				 * 獲取當前標籤下所有給定名字的
				 * 標籤
				 * 
				 * List elements()
				 * 獲取當前標籤下的所有子標籤。
				 */
				List<Element> elements 
								= root.elements();
				/*
				 * 建立一個集合,用於儲存xml中
				 * 的每一個使用者資訊。我們先將
				 * 使用者資訊取出,然後建立一個Emp
				 * 例項,將資訊設定到該例項的相應
				 * 屬性上。最終將所有emp物件存入
				 * 該集合。
				 */
				List<Emp> list
					= new ArrayList<Emp>();
				/*
				 *	遍歷每一個emp標籤 
				 */
				for(Element emp : elements){
					//建立一個Emp物件,用於儲存資訊
					Emp e = new Emp();
					
					//解析emp標籤
					//獲取name的值
					/*
					 * 首先,獲取名為"name"的子標籤
					 * 其次,獲取前後標籤中間的文字
					 */
					Element ename
						=	emp.element("name");
					String name
						=	ename.getText();
					
					//獲取年齡
					/*
					 * String elementText(String name)
					 * 獲取當前標籤中名為給定名字的子標籤
					 * 中間的文字
					 * 該方法與上面獲取“name”的兩句話等效
					 */
					String ageStr
						= emp.elementText("age");
					int age 
						= Integer.parseInt(ageStr);
					
					//解析性別
					String gender
						= emp.elementText("gender");
					
					//解析工資
					int salary
						= Integer.parseInt(
							 emp.elementText("salary")	
						  );
					
					e.setAge(age);
					e.setName(name);
					e.setGender(gender);
					e.setSalary(salary);
					
					/*
					 * 通過Element獲取元素屬性
					 * 
					 * Attribute attribute(String name)
					 * 獲取當前標籤中指定名字的屬性
					 */
					//獲取id屬性
					Attribute attr
						=	emp.attribute("id");
					//獲取該屬性的值
					/*
					 * Attribute表示一個屬性,常用方法:
					 * 
					 * String getValue()
					 * 獲取該屬性的值
					 * 
					 * String getName()
					 * 獲取該屬性的名字
					 */
					int id =Integer.parseInt(
										attr.getValue()
									);
					
					e.setId(id);
					//將Emp物件存入集合
					list.add(e);
				}
				
				System.out.println(
						"解析了"+list.size()+
						"個員工資訊");
				
				//輸出每一個員工資訊
				for(Emp e : list){
					System.out.println(e);
				}
				
				
			}catch(Exception e){
				
			}
	}
}


寫入XML
package demoXml;

import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;

/**
 * 使用DOM寫出一個XML
 * @author Administrator
 *
 */
public class XMLDemo2 {
	public static void main(String[] args){		
		List<Emp> list
			= new ArrayList<Emp>();
		list.add(
			new Emp(1,"jack",33,"男",5000)
		);
		list.add(
				new Emp(2,"boss",55,"男",55000)
			);
		list.add(
				new Emp(3,"marry",22,"女",3500)
			);
		list.add(
				new Emp(4,"kate",25,"女",6000)
			);
		list.add(
				new Emp(5,"tom",32,"男",8500)
			);
		
		/*
		 * 生成一個xml的基本步驟
		 * 1:建立文件物件Document
		 * 2:為Document新增根節點
		 * 3:為根節點組建樹狀結構
		 * 4:建立XMLWriter
		 * 5:為XMLWriter指定寫出目標
		 * 6:寫出xml
		 */
		//1
		//通過DocumentHelper建立Document物件
		Document doc 
			= DocumentHelper.createDocument();
		
		//2
		/*
		 * Document的方法
		 * Element addElement(String name)
		 * 該方法用於向文件中新增給定名字的
		 * 根元素,返回的Element例項就表示該
		 * 根元素
		 * 需要注意的是,該方法只能呼叫一次。
		 * 呼叫第二次會丟擲異常。 
		 */
		Element root 
				= doc.addElement("list");
		/*
		 * 迴圈新增每一個員工資訊
		 */
		for(Emp e : list){
			/*
			 * Element同樣支援方法:
			 * Element addElement(String name)
			 * 向當前標籤中新增給定名字的子標籤
			 */
			//向根標籤中新增emp標籤
			Element emp 
				=	root.addElement("emp");
			
			//向emp標籤中新增子標籤name
			Element name
				= emp.addElement("name");
			name.addText(e.getName());
			//向emp標籤中新增子標籤age
			emp.addElement("age")
			.addText(e.getAge()+"");
			emp.addElement("gender")
			.addText(e.getGender());
			emp.addElement("salary")
			.addText(e.getSalary()+"");

			/*
			 * 為標籤新增屬性
			 * Element addAttribute(
			 * 		String name,String value
			 * )
			 * 為當前標籤新增給定名字以及對應值的
			 * 屬性
			 * 返回值仍然為當前標籤。
			 * 這樣做的目的是可以連續新增若干屬性
			 * 就好像StringBuilder的append的
			 * 返回值效果和作用。
			 */
			emp.addAttribute("id",e.getId()+"");
			
		}
		
		/*
		 * 當退出迴圈後,那麼Document中的
		 * 結構就已經構建完了
		 * 需要將其寫出為xml
		 */
		try{
			XMLWriter writer
					= new XMLWriter();
			
			FileOutputStream out
				= new FileOutputStream(
											"myemp.xml");
			
			writer.setOutputStream(out);
			/*
			 * 將Document物件寫出到檔案中
			 * 這時會將Document轉換為xml格式
			 * 寫入檔案。
			 */
			writer.write(doc);
			
			writer.close();
		}catch(Exception e){
			
		}
	}
}

DOM4J對XPATH的支援

package demoXml;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * DOM4J對XPATH的支援
 * @author Administrator
 *
 */
public class XMLDemo3 {
	public static void main(String[] args){
		try{
			//讀取xml檔案轉換為Document
			SAXReader reader
				= new SAXReader();
			
			Document doc 
					= reader.read(
							new File("myemp.xml")
						);
			String path 
				= "/list/emp[gender='女']" +
					"/salary[.>4000]";
			/*
			 * List selectNodes(String xpath)
			 * 根據給定的XPATH查詢對應的節點
			 */
			List list 
				= doc.selectNodes(path);
			for(Object o : list){
				Element e = (Element)o;
				System.out.println(e.getText());
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}