一:dom4j方式介绍
对于xml的解析总共有三种
1:jaxp方式,是sun公司开发的,分为sax方式和dom方式
2:jdom方式,后来其中部分人员参与开发dom4j
3:dom4j方式,是现在企业使用比较多的一种方式
二:代码案例
1:读取xml文件中某个节点
1):获取第二个学生的名字
@Test
// 1:获取第二个学生的名字
public void test01() throws DocumentException {
// 1:获取解析器
SAXReader reader = new SAXReader();
// 2:获取doc文档
Document doc = reader.read(new File("xml/exam.xml"));
// 3:获取根元素
Element root = doc.getRootElement();
// 4:获取所有的学生节点
List list = root.elements("student");
Element student = (Element) list.get(1);
String name = student.element("name").getText();
System.out.println(name);
}
2):获取第2个学生的属性名和值
@Test
// 2:获取第2个学生的属性名和值
public void test02() throws DocumentException {
// 1:获取解析器
SAXReader reader = new SAXReader();
// 2:获取doc文档
Document doc = reader.read(new File("xml/exam.xml"));
// 3:获取根元素
Element root = doc.getRootElement();
// 4:获取所有的学生节点
List list = root.elements("student");
Element student = (Element) list.get(1);
// String value = student.element("name").attribute("sid").getValue();
String value = student.element("name").attributeValue("sid");
System.out.println("sid:" + value);
}
2:向xml文档中添加节点
@Test
// 3:向第一个学生添加学分节点
public void test03() throws DocumentException,
IOException {
// 1:获取解析器
SAXReader reader = new SAXReader();
// 2:获取doc文档
Document doc = reader.read(new File("xml/exam.xml"));
// 3:获取根元素
Element root = doc.getRootElement();
// 4:获取所有的学生节点
Element student = root.element("student");
student.addElement("score").setText("100"); // 5:将内存中的内容写入xml文件中
XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
writer.write(doc);
writer.flush();
writer.close();
}
3:向指定位置添加节点
这里要遍历修改添加节点的父类得到list集合,然后将节点
添加到list集合的具体位置。
@Test
// 4:向指定位置添加节点(在第二个学生的年龄元素后面添加节点)
public void test04() throws DocumentException, IOException {
// 1:获取解析器
SAXReader reader = new SAXReader();
// 2:获取doc文档
Document doc = reader.read(new File("xml/exam.xml"));
// 3:获取根元素
Element root = doc.getRootElement();
// 4:获取第二个学生节点
Element student = (Element) root.elements("student").get(1);
List list = student.elements(); // 创建分数节点
Element score = DocumentHelper.createElement("score");
score.setText("100");
// 将节点添加到学生节点
list.add(2, score); // 将内存document写入xml
XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
writer.write(doc);
writer.close();
}
4:删除节点
得到删除节点以及父节点,然后就可以操作了,比较简单
@Test
// 删除上一步添加的几点
public void test05() throws DocumentException, IOException,
FileNotFoundException {
// 1:获取解析器
SAXReader reader = new SAXReader();
// 2:获取doc文档
Document doc = reader.read(new File("xml/exam.xml"));
// 3:获取根元素
Element root = doc.getRootElement();
// 4:获取第二个学生节点
Element student = (Element) root.elements("student").get(1);
Element score = student.element("score");
student.remove(score); // 将内存document写入xml
XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
writer.write(doc);
writer.close();
}
5:修改节点内容
@Test
// 修改第二个学生的性别
public void test06() throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("xml/exam.xml")); Element root = doc.getRootElement();
Element student = (Element) root.elements("student").get(1);
Element stuGender = student.element("gender");
stuGender.setText("男"); // 将内存document写入xml
XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
writer.write(doc);
writer.close();
}
6:修改节点属性值
@Test
// 修改节点的属性(修改第二个学生的sid属性为345)
public void test07() throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("xml/exam.xml")); Element root = doc.getRootElement();
Element student = (Element) root.elements("student").get(1);
Attribute attr = student.attribute("sid");
attr.setValue("345"); // 将内存document写入xml
XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml"));
writer.write(doc);
writer.close();
}
三:Xpath的用法
由于dom4j的解析总是先解析根节点,然后再获取子节点.....,如果xml文件很很多层,那么解析起来会很麻烦,
所有dom4j开发出来Xpath,有点类似正则表达式的感觉
用例:
谓语:
测试案例:
//student :获取所有的xml中所有的student元素
[@username='username'] : 获取username为username值的student元素
@Test
public void testXpath() throws DocumentException {
// 模拟输入用户名和密码
String username = "Tom";
String password = "123"; SAXReader reader = new SAXReader();
Document doc = reader.read("xml/exam.xml"); Node node = doc.selectSingleNode("//student[@username='" + username
+ "' and @password='" + password + "']");
if (null != node) {
System.out.println("登录成功!");
} else {
System.out.println("登录失败!");
}
}