欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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);
    }
}