Java之DOM4J解析XML 實現 XML檔案資料的增刪改查方法
阿新 • • 發佈:2018-12-10
下面是我的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(); } }