XPath查询

XPath是XML路径语言,用于在XML文档中定位信息。DOM4J提供了对XPath的接口支持,包括selectNodes用于获取匹配XPath表达式的多个节点,selectSingleNode获取第一个匹配的节点,以及valueOf获取匹配节点的文本内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------------------------------XPath查询--------------------------------------------

1 什么是XPath

XPath即为XML路径语言(XMLPath Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言。

 

2 DOM4J对XPath的支持

在DOM4J中,Node接口中的三个方法最为常用: 

l  List selectNodes(String xpathExpression):在当前节点中查找满足XPath表达式的所有子节点;

l  Node selectSingleNode(String xpathExpression):在当前节点中查找满足XPath表达式的第一个子节点;

l  String valueOf(String xpathExpression):在当前节点中查找满足XPath表达式的第一个子节点的文本内容;

 

Document doc = reader.read(new FileInputStream("person.xml"));

             

              Element root = doc.getRootElement();

              List<Element> eList = root.selectNodes("/persons");

              List<Element> eList1 = root.selectNodes("/persons/person/name");

             

             

              List<Element> eList2 = root.selectNodes("//age");

              List<Element> eList3 = root.selectNodes("//person/age");

             

             

              List<Element> eList4 = root.selectNodes("/*/*/address");

              List<Element> eList5 = root.selectNodes("//*");

             

              List<Element> eList6 = root.selectNodes("/persons/person[1]");

              List<Element> eList7 = root.selectNodes("/persons/person[last()]");

             

             

              List<Element> eList8 = root.selectNodes("//@id");

              List<Element> eList9 = root.selectNodes("//person[@id]");

              List<Element> eList10 = root.selectNodes("//person[@*]");

              List<Element> eList11 = root.selectNodes("//*[not(@*)]");

             

             

              List<Element> eList12 = root.selectNodes("//person[@id='person1']");

 

package cn.tx.dom4j;

 

import java.io.FileInputStream;

import java.io.IOException;

import java.util.List;

 

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

 

public class SelectXML {

      

       /**

        * 读取xml文件的方法,使用XPath获得元素

        */

       public static void readXML() {

              //创建xml文档读取dom4j的对象

              SAXReader reader = new SAXReader();

              //创建文档流

              FileInputStream in = null;

              try {

                     in = new FileInputStream("src/student.xml");

                     //读取文档,返回文档对象

                     Document doc = reader.read(in);

                     //获得文档对象的根元素

                     Element root = doc.getRootElement();

                     //获得students元素

                     List<Element> eList = root.selectNodes("/students");

                     //获得students下的所有子元素

                     List<Element> stuList = root.selectNodes("/students/student");

                     //获得student下的name元素

                     List<Element> nameList = root.selectNodes("/students/student/name");

                     //使用“//”查出所有name的元素

                     List<Element> nameList1 = root.selectNodes("//name");

                     //使用“//”+“/”查出student下的score元素,无论层级关系只要满足双斜线后面的元素就都查询出来

                     List<Element> scoreList = root.selectNodes("//student/score");

                     //使用“ * ”查询student下所有的元素

                     List<Element> stuList1 = root.selectNodes("//student/*");

                     //使用/*/*/name 查出两级元素下所有的name元素

                     List<Element> nameList2 = root.selectNodes("/*/*/name");

                     //获得指定索引的元素

                     //获得students下的第一个student元素

                     List<Element> stuList2 = root.selectNodes("/students/student[1]");

                     //获得students下最后一个student元素

                     List<Element> stuList3 = root.selectNodes("/students/student[last()]");

                     //获得students下带有gender属性的元素,通过属性来筛选上一层中带有指定属性的元素

                     List<Element> stuList4 = root.selectNodes("/students/student/@gender");

                     //获得同级元素下指定的属性元素

                     List<Element> stuList5 = root.selectNodes("/students/student[@gender]");

                     //获得同级元素下所有带属性的元素

                     List<Element> stuList6 = root.selectNodes("/students/student[@*]");

                     //获得同级元素下所有不带属性的元素

                     List<Element> stuList7 = root.selectNodes("/students/student[not(@*)]");

                     //获得指定属性等于指定值得元素

                     List<Element> stuList8 = root.selectNodes("/students/student[@stuNo='5']");

                     //获得使用normalize-space()函数去掉属性值得前后空格后,指定属性等于指定值得元素

                     List<Element> stuList9 = root.selectNodes("/students/student[normalize-space(@stuNo)='6']");

                     //使用count()函数获得含有一个name元素的上级元素元素

                     List<Element> stuList10 = root.selectNodes("/students//*[count(name)=1]");

                     //获得含有任意三个子元素的上级元素

                     List<Element> stuList11 = root.selectNodes("/students//*[count(*)=3]");

                     //使用name()函数获得元素名为score的元素,name()函数等同于//加函数名

                     List<Element> stuList12 = root.selectNodes("//*[name()='score']");

                     //使用starts-with(name(),元素名开头字母)获得以指定字母开头的元素

                     List<Element> stuList13 = root.selectNodes("//*[starts-with(name(),'a')]");

                     //使用contains(name(),元素名所包含的字母)函数获得包含指定字母的元素名的元素

                     List<Element> stuList14 = root.selectNodes("/students/student/name[contains(name(),'m')]");

                     //获得元素名的字符长度等于4的元素,如果想要大于和小于字符长度判断只需要改变符号即可

                     List<Element> stuList15 = root.selectNodes("//*[string-length(name())='4']");

                     System.out.println(stuList15);

                    

              } catch (Exception e) {

                     e.printStackTrace();

              } finally {

                     try {

                            if(in != null) {

                            in.close();

                            }

                     } catch (IOException e) {

                            e.printStackTrace();

                     }

              }

       }

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值