使用dom4j支援xpath的操作( 可以直接獲取到某個元素)
採用dom4j對xpath 的操作,可以直接獲取到某個元素,不用像sax 一樣一層一層解析
第一種形式
/AAA/DDD/BBB: 表示一層一層的,AAA下面 DDD下面的BBB
第二種形式
//BBB: 表示和這個名稱相同,表示只要名稱是BBB,都得到
第三種形式
/ *: 所有元素
第四種形式
BBB[1]: 表示第一個BBB元素
×× BBB[last()]:表示最後一個BBB元素
第五種形式
//BBB[@id]: 表示只要BBB元素上面有id屬性,都得到
第六種形式
//BBB[@id='b1'] 表示元素名稱是BBB,在BBB上面有id屬性,並且id的屬性值是b1
使用dom4j支援xpath具體操作
預設的情況下,dom4j不支援xpath
如果想要在dom4j裡面是有xpath
第一步需要,引入支援xpath的jar包,使用 jaxen-1.1-beta-6.jar
需要把jar包匯入到專案中
在dom4j裡面提供了兩個方法,用來支援xpath
selectNodes("xpath表示式")
- 獲取多個節點
selectSingleNode("xpath表示式")
- 獲取一個節點
使用xpath實現:查詢xml中所有name元素的值
所有name元素的xpath表示: //name
使用selectNodes("//name");
程式碼和步驟
/
1、得到document
2、直接使用selectNodes("//name")方法得到所有的name元素
/
//得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
//使用selectNodes("//name")方法得到所有的name元素
List<Node> list = document.selectNodes("//name");
//遍歷list集合
for (Node node : list) {
//node是每一個name元素
//得到name元素裡面的值
String s = node.getText();
System.out.println(s);
}
//查詢xml中所有name元素的值
public static void test1() throws Exception {
/*
* 1、得到document
* 2、直接使用selectNodes("//name")方法得到所有的name元素
*
* */
//得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
//使用selectNodes("//name")方法得到所有的name元素
List<Node> list = document.selectNodes("//name");
//遍歷list集合
for (Node node : list) {
//node是每一個name元素
//得到name元素裡面的值
String s = node.getText();
System.out.println(s);
}
}
使用xpath實現:獲取第一個p1下面的name的值
//p1[@id1='aaaa']/name
使用到 selectSingleNode("//p1[@id1='aaaa']/name")
步驟和程式碼
/
1、得到document
2、直接使用selectSingleNode方法實現
- xpath : //p1[@id1='aaaa']/name
/
//得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
//直接使用selectSingleNode方法實現
Node name1 = document.selectSingleNode("//p1[@id1='aaaa']/name"); //name的元素
//得到name裡面的值
String s1 = name1.getText();
System.out.println(s1);
//使用xpath實現:獲取第一個p1下面的name的值
public static void test2() throws Exception {
/*
* 1、得到document
* 2、直接使用selectSingleNode方法實現
* - xpath : //p1[@id1='aaaa']/name
* */
//得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
//直接使用selectSingleNode方法實現
Node name1 = document.selectSingleNode("//p1[@id1='aaaa']/name"); //name的元素
//得到name裡面的值
String s1 = name1.getText();
System.out.println(s1);
}
14、實現簡單的學生管理系統
使用xml當做資料,儲存學生資訊
建立一個xml檔案,寫一些學生資訊
<?xml version="1.0" encoding="UTF-8"?>
<sudent>
<stu>
<id>100</id>
<name>zhangsan</name>
<age>20</age>
</stu>
<stu>
<id>101</id>
<name>lisi</name>
<age>30</age>
</stu>
</sudent>
package cn.itcast.service;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import cn.itcast.vo.Student;
public class StuService {
//查詢 根據id查詢學生資訊
public static Student getStu(String id) throws Exception {
/*
* 1、建立解析器
* 2、得到document
*
* 3、獲取到所有的id
* 4、返回的是list集合,遍歷list集合
* 5、得到每一個id的節點
* 6、id節點的值
* 7、判斷id的值和傳遞的id值是否相同
* 8、如果相同,先獲取到id的父節點stu
* 9、通過stu獲取到name age值
*
* */
//建立解析器
SAXReader saxReader = new SAXReader();
//得到document
Document document = saxReader.read("src/student.xml");
//獲取所有的id
List<Node> list = document.selectNodes("//id");
//建立student物件
Student student = new Student();
//遍歷list
for (Node node : list) { //node是每一個id節點
//得到id節點的值
String idv = node.getText();
//判斷id是否相同
if(idv.equals(id)) {
//得到id的父節點 stu
Element stu = node.getParent();
//通過stu獲取name和age
String namev = stu.element("name").getText();
String agev = stu.element("age").getText();
student.setId(idv);
student.setName(namev);
student.setAge(agev);
}
}
return student;
}
//增加
public static void addStu(Student student) throws Exception {
/*
* 1、建立解析器
* 2、得到document
* 3、獲取到根節點
* 4、在根節點上面建立stu標籤
* 5、在stu標籤上面依次新增id name age
* 6、在id name age上面依次新增值
*
* 7、回寫xml
* */
//建立解析器
SAXReader saxReader = new SAXReader();
//得到document
Document document = saxReader.read("src/student.xml");
//得到根節點
Element root = document.getRootElement();
//在根節點上面新增stu
Element stu = root.addElement("stu");
//在stu標籤上面依次新增id name age標籤
Element id1 = stu.addElement("id");
Element name1 = stu.addElement("name");
Element age1 = stu.addElement("age");
//在id name age上面依次新增值
id1.setText(student.getId());
name1.setText(student.getName());
age1.setText(student.getAge());
//回寫xml
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/student.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
//刪除 根據學生的id刪除
public static void delStu(String id) throws Exception {
/*
* 1、建立解析器
* 2、得到document
*
* 3、獲取到所有的id
* 使用xpath //id 返回 list集合
* 4、遍歷list集合
* 5、判斷集合裡面的id和傳遞的id是否相同
* 6、如果相同,把id所在的stu刪除
*
* */
//建立解析器
SAXReader saxReader = new SAXReader();
//得到document
Document document = saxReader.read("src/student.xml");
//獲取所有的id xpath: //id
List<Node> list = document.selectNodes("//id");
//遍歷list集合
for (Node node : list) { //node是每一個id的元素
//得到id的值
String idv = node.getText();
//判斷idv和傳遞的id是否相同
if(idv.equals(id)) { //id相同
//得到stu節點
Element stu = node.getParent();
//獲取stu的父節點
Element student = stu.getParent();
//刪除stu
student.remove(stu);
}
}
//回寫xml
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/student.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
}
package cn.itcast.test;
import cn.itcast.service.StuService;
import cn.itcast.vo.Student;
public class TestStu {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// testAdd();
// testDel();
testSelect();
}
//測試查詢方法
public static void testSelect() throws Exception {
Student stu = StuService.getStu("100");
System.out.println(stu.toString());
}
//測試刪除方法
public static void testDel() throws Exception {
StuService.delStu("103");
}
//測試新增方法
public static void testAdd() throws Exception {
//設定值
Student stu = new Student();
stu.setId("103");
stu.setName("wangwu");
stu.setAge("40");
StuService.addStu(stu);
}
}
package cn.itcast.vo;
public class Student {
private String id;
private String name;
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
增加操作
/
1、建立解析器
2、得到document
3、獲取到根節點
4、在根節點上面建立stu標籤
5、在stu標籤上面依次新增id name age
addElement方法新增
6、在id name age上面依次新增值
setText方法
7、回寫xml
/
刪除操作(根據id刪除)
/
1、建立解析器
2、得到document
3、獲取到所有的id
使用xpath //id 返回 list集合
4、遍歷list集合
5、判斷集合裡面的id和傳遞的id是否相同
6、如果相同,把id所在的stu刪除
/
查詢操作(根據id查詢)
/
1、建立解析器
2、得到document
3、獲取到所有的id
4、返回的是list集合,遍歷list集合
5、得到每一個id的節點
6、id節點的值
7、判斷id的值和傳遞的id值是否相同
8、如果相同,先獲取到id的父節點stu
9、通過stu獲取到name age值
把這些值封裝到一個物件裡面 返回物件
/