java编程之xpath介绍
一、使用dom4j支持xpath的操作
—可以直接获取到某个元素,而不用一层一层的解析获取
xpath如何使用:
第一种形式:/aaa/bbb/ccc,一个/代表一层,表示获取到aaa下面的bbb下面的ccc
第二种形式://bbb,表示和这个名称相同的都可以得到,只要名称是bbb都可以得到。//ddd/bbb:得到所有ddd下面的所有的bbb
第三种形式:/aaa/bbb/ccc/*,得到所有aaa下面bbb下面ccc下面的所有的元素。/*/*/*/bbb,表示限制前三层,前三层无论是什么名称都可以得到其下面的所有的bbb。//*,得到所有的元素。
第四种形式:/aaa/bbb[1],aaa下面的第一个bbb。/aaa/bbb[last()],表示得到aaa下面的最后一个bbb
第五种形式://@id,表示只要标签上有id属性都可以得到,得到所有有id属性的//bbb[@id],只要你bbb上有id属性都可以得到,得到有id属性的bbb
第六种形式://bbb[@id='b1'],得到含有属性id且值为b1的所有bbb
二、使用xpath
默认情况下,dom4j不支持xpath。
要想支持需要导入jar包,jaxen-1.1-beta-6.jar
有两个方法:selectnodes(“xpath标签表达式”);获得所有的元素,返回的是list,selectsinglenode(“xpath标签表达式”);获得一个元素,返回的是node
1、查询xml中的所有name元素的值
步骤:获取document,使用方法selectnodes(“xpath标签表达式”);
public static void test1() throws exception { document document = dom4jutils.getdocument(dom4jutils.path); list<node> list = document.selectnodes("//name"); for (node node : list) { //node是每一个元素具体的值 //得到每一个元素具体的值 string s = node.gettext(); system.out.println(s); } }
2、查询xml中第一个name的值。步骤:先获取document,然后构建xpath表达式。
public static void test2() throws exception{ document document = dom4jutils.getdocument(dom4jutils.path); node name1 = document.selectsinglenode("//p1[@id1='aaa']/name"); //得到name的值 string s1 = name1.gettext(); system.out.println(s1); }
二、案例分析
添加、删除、查询
student.xml
<?xml version="1.0" encoding="utf-8"?> <student> <stu> <id>01</id> <name>zhangsan</name> <age>20</age> </stu> <stu> <id>02</id> <name>lisi</name> <age>19</age> </stu> </student>
student.java
package cn.qing.ov; 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 + "]"; } }
stuservice.java
package cn.qing.service; import java.io.fileoutputstream; import java.io.writer; 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.qing.ov.student; public class stuservice { //增加 public static void addstu(student student) throws exception { saxreader saxreader = new saxreader(); 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进行删除 /** * * @param id * @throws exception * 1.创建解析器 * 2.获得document * 3.获取xml中的id,使用xpath,返回一个list集合 * 4.遍历list,判断集合里的值是否和传进来的id相同 * 5.如果相同,把id所在的stu删除 * 6.回写 */ public static void delstu(string id) throws exception { saxreader saxreader = new saxreader(); document document = saxreader.read("src/student.xml"); list<node> list = document.selectnodes("//id"); for (node node : list) { string idv = node.gettext(); //判断是否和传递的值相同 if(idv.equals(id)) { //得到stu的节点 element stu = node.getparent(); //删除是通过父节点进行删除 element student = stu.getparent(); student.remove(stu); } } outputformat format =outputformat.createprettyprint(); xmlwriter xmlwriter = new xmlwriter(new fileoutputstream("src/student.xml"),format); xmlwriter.write(document); xmlwriter.close(); } //查询 public static student selstu(string id) throws exception { saxreader saxreader = new saxreader(); document document = saxreader.read("src/student.xml"); list<node> list = document.selectnodes("//id"); student student = new student(); for (node node : list) { //node 是每一个id的值 string idv = node.gettext(); if(idv.equals(id)) { element stu = node.getparent(); string namev = stu.element("name").gettext(); string agev = stu.element("age").gettext(); student.setid(idv); student.setname(namev); student.setage(agev); } } return student; } }
测试test.java
package cn.qing.test; import cn.qing.ov.student; import cn.qing.service.stuservice; public class test { public static void main(string[] args) throws exception { //testadd(); //testdel(); testsel(); } //测试添加方法 public static void testadd() throws exception { //创建student对象 student stu = new student(); stu.setid("03"); stu.setname("wangwu"); stu.setage("18"); stuservice.addstu(stu); } //测试删除方法 public static void testdel() throws exception { stuservice.delstu("03"); } //测试查询方法 public static void testsel() throws exception { student student = stuservice.selstu("02"); system.out.println(student.tostring()); } }
对于每一种类型,可以为其设置在不同的包,编程的思想
总结
以上就是本文关于java编程之xpath介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!