【XML】使用dom4j支持XPATH
程序员文章站
2022-05-28 21:05:03
...
1.XPATH简介
1.可以直接取到某个元素
2.
第一种方式:
/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
2.使用dom4j支持XPATH
1.默认情况下,dom4j不支持xpath
2.如果想在dom4j下面有xpath:
引入xpath的jar包,把jar包导入到项目
3.在dom4j中提供两个方法支持xpath
selectNodes(“XPATH表达式”):获取多个节点
selectSingleNode(“XPATH表达式”):获取单一节点
3.使用XPATH实现查询操作
所有name元素的XPATH表示方法://name
package dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import java.util.List;
public class TestDom4j4 {
public static void main(String[] args) {
//查询xml元素中所有name元素的值
/*
1.得到document
2.直接使用selectNode("//name")得到多有的name
3.
*/
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
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=‘ghh’]/name
package dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Node;
import java.util.List;
public class TestDom4j5 {
public static void main(String[] args) {
//获取第一个p1下面的name元素的值
/*
1.得到document
2.直接使用selectSingleNode()方法
XPATH://p1[@[id1='ghh']/name
*/
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
Node name1 = document.selectSingleNode("//p1[@id1='ghh']/name");
//得到name里面的值
String s1 = name1.getText();
System.out.println(s1);
}
}
5.学生管理系统实现
<?xml version="1.0" encoding="UTF-8"?>
<student>
<stu>
<id>100</id>
<name>zhangsan</name>
<age>20</age>
</stu>
<stu>
<id>101</id>
<name>lisi</name>
<age>30</age>
</stu>
</student>
package Example;
public class Student {
private String id;
private String age;
private String name;
public String getId() {
return id;
}
public String getAge() {
return age;
}
public String getName() {
return name;
}
public void setId(String id) {
this.id = id;
}
public void setAge(String age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", age='" + age + '\'' +
", name='" + name + '\'' +
'}';
}
}
package Example;
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.SAXContentHandler;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class StuService {
public StuService() throws DocumentException {
}
//增加
public static void addStu(Student student) throws DocumentException, IOException {
/*
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下面依次添加id1 name1 age1
Element id1 = stu.addElement("id");
Element name1 = stu.addElement("name");
Element age1 = stu.addElement("age");
//在id1 name1 age1下面依次添加值
id1.setText(student.getId());
name1.setText(student.getName());
age1.setText(student.getAge());
//回写xml
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src\\student.xml"),outputFormat);
xmlWriter.write(document);
xmlWriter.close();
}
//删除,根据学生的id删除
public static void delStu(String id) throws DocumentException, IOException {
/*
1.创建解析器
2.得到document
3.获取到所有的id
4.遍历list
5.判断集合里的id和传递的id是否相同
6.如果相同,把id所在的stu删除
*/
//创建解析器
SAXReader saxReader = new SAXReader();
//得到document
Document document = saxReader.read("src\\student.xml");
//获取所有的Id
List<Node> list = document.selectNodes("//id");
//遍历id
for(Node node:list){
//得到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 outputFormat = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src\\student.xml"),outputFormat);
xmlWriter.write(document);
xmlWriter.close();
}
//查询,根据id查询学生的信息
public static Student selStu(String id) throws DocumentException {
/*
1.创建解析器
2.得到document
3.获取到所有的id
4.遍历list集合
5.得到id节点的值
6.判断id的值和传递的id的值是否相同
*/
//创建student对象
Student student = new Student();
//创建解析器
SAXReader saxReader = new SAXReader();
//得到document
Document document = saxReader.read("src\\student.xml");
//获取所有的Id
List<Node> list = document.selectNodes("//id");
//遍历id
for(Node node:list){
//得到id的值
String idv = node.getText();
//判断idv和id是否相同
if(idv.equals(id)){
//获取id所在的stu
Element stu = node.getParent();
//通过stu获取name和age
String agev = stu.element("age").getText();
String namev = stu.element("name").getText();
student.setId(idv);
student.setName(namev);
student.setAge(agev);
}
}
return student;
}
}
package Example;
import org.dom4j.DocumentException;
import java.io.IOException;
public class TestStu {
public static void main(String[] args) throws IOException, DocumentException {
testAdd();
testDelete();
testSelect();
}
public static void testAdd() throws IOException, DocumentException {
//设置值
Student stu = new Student();
stu.setId("3");
stu.setAge("25");
stu.setName("ghh");
StuService.addStu(stu);
}
public static void testDelete() throws IOException, DocumentException {
StuService.delStu("3");
}
public static void testSelect() throws DocumentException {
Student stu = StuService.selStu("100");
System.out.println(stu);
}
}
上一篇: Dom4j中使用Xpath检索不到数据
推荐阅读
-
如何使用XPath提取xml文档数据
-
java使用dom4j生成与解析xml文档的方法示例
-
在dom4j中使用XPath的简单实例
-
使用dom4j写xml文件——源码
-
java基础 xml 使用dom4j解析 xml文件 servlet根据pattern 找到class
-
Dom4J解析使用xpath java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
-
Dom4J解析使用xpath java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
-
Java基础之XML介绍与SAX解析、DOM解析XML、JDOM解析、DOM4J解析、XMLEncoder与XMLDecoder的使用以及xstream工具的使用 189~195
-
【XML解析】使用Dom4j对XML进行SAX解析
-
使用工厂模式或dom4j 获取document(保存和读取xml文件)