1. 程式人生 > >Java之DOM4J解析XML 實現 XML檔案資料的增刪改查方法

Java之DOM4J解析XML 實現 XML檔案資料的增刪改查方法

下面是我的Persons.xml檔案資料

<?xml version="1.0" encoding="utf-8"?>
<persons>
	<person id="0">
		<name>翠花</name>
		<age>18</age>
		<sex>女</sex>
	</person>
	<person id="1">
		<name>老王</name>
		<age>20</age>
		<sex>男</sex>
	</person>
</persons>

增刪改查:

/**
 * DOM4J解析XML 
 * XML檔案資料的增刪改查
 * @author 鄭清
 */
public class Dom4jDemo {

	static File url = new File("E:/eclipse-workspace/JavaEE_workspace/Day34XML/src/Persons.xml");// Persons.xml檔案絕對路徑

	public static void main(String[] args) throws Exception {
		dom4jGetElement();// dom4j原生方式解析xml
		dom4jXPathGetElement();// dom4j Xpath方式解析xml
		dom4jUpdateElement();//修改資料
		dom4jAddElement();//新增資料
		dom4jDeleteElement();//刪除資料
	}

	public static void dom4jGetElement() throws Exception {
		// 獲取一個Document物件
		SAXReader saxReader = new SAXReader();
		Document doc = saxReader.read(url);

		// 通過文件物件doc獲取文件中的根節點
		Element root = doc.getRootElement();
		// 獲取節點person
		List<Element> personList = root.elements();// 獲取多個標籤(即根節點下的子節點),返回集合物件

		// 獲取第1個節點
		Element person = personList.get(0);
		// 獲取第1個節點下的name元素
		Element element = person.element("name");
		// 獲取name中的文字
		System.out.println(element.getText());
		System.out.println(person.elementText("name"));

		// 注意:只能獲取一次節點值    第二次獲取的值還是第一次的!!
		/* Element person2 = personList.get(1); 
		 Element element2 =person.element("name");
		 System.out.println(element2.getText());*/
	}

	public static void dom4jXPathGetElement() throws Exception {
		// 獲取一個Document物件
		SAXReader saxReader = new SAXReader();
		Document doc = saxReader.read(url);
		
		// 獲取id為1的節點下的name元素
		Node name = doc.selectSingleNode("/persons/person[@id = '1']/name[1]");
		System.out.println(name.getText());
	}

	public static void dom4jUpdateElement() throws Exception {
		// 獲取一個Document物件
		SAXReader saxReader = new SAXReader();
		Document doc = saxReader.read(url);
		
		// 獲取id為1的節點下的name元素
		Node name = doc.selectSingleNode("/persons/person[@id = '1']/name[1]");
		name.setText("這裡是修改的id為1的節點下的name元素值");

		// 注意:XML檔案是被載入到記憶體中 修改也是在記憶體中 ==》因此需要將記憶體中的資料同步到磁碟中
		XMLWriter writer = new XMLWriter(new FileWriter(url));//將記憶體資料關聯給一個字元輸出流
		writer.write(doc);
		writer.close();
	}

	public static void dom4jAddElement() throws Exception {
		// 獲取一個Document物件
		SAXReader saxReader = new SAXReader();
		Document doc = saxReader.read(url);
		
		//獲取根節點
		Element root = doc.getRootElement();
		//新增一個標籤 即一個節點
		Element person = root.addElement("person");

		//新增值到節點中
		person.addElement("name").setText("小星");
		person.addElement("age").setText("16");
		person.addElement("sex").setText("女");

		// 注意:XML檔案是被載入到記憶體中 修改也是在記憶體中 ==》因此需要將記憶體中的資料同步到磁碟中
		//XMLWriter writer = new XMLWriter(new FileWriter(url));
		
		// 按照指定格式將dom列印到xml檔案中
		//方式一:
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(new FileWriter(url), format);//構造一個具有良好輸出格式的XML輸出物件
		writer.write(doc);
		writer.close();
		
		//方式二:
//		OutputFormat format = OutputFormat.createCompactFormat();
//	    writer = new XMLWriter(new FileWriter(url), format);
//	    writer.write( doc );
//	    writer.close();
	}
	
	public static void dom4jDeleteElement() throws Exception {
		// 獲取一個Document物件
		SAXReader reader = new SAXReader();
		Document doc = reader.read(url);		
		
		// 通過文件物件doc獲取文件中的根節點
		Element root = doc.getRootElement();
		//獲取第2個節點
		Node person = root.selectSingleNode("/persons/person[2]");
		//移出節點
		root.remove(person);
		
		// 注意:XML檔案是被載入到記憶體中 修改也是在記憶體中 ==》因此需要將記憶體中的資料同步到磁碟中
		XMLWriter writer = new XMLWriter(new FileWriter(url));
		
		// 按照指定格式將dom列印到xml檔案中
		OutputFormat format = OutputFormat.createPrettyPrint();
        writer = new XMLWriter(new FileWriter(url), format );
        writer.write( doc );
        writer.close();
	}
	
}