浅谈XPath

1.XPath是什么?

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。

2.为什么要使用XPath?

XPath 用于在 XML 文档中通过元素和属性进行导航。如果XML节点过多或者复杂,那么需要使用XPath就比较方便。

3.Xpath的基本准则表达式

基本 XPath 表达式 (判断是谁的集合!!)
3.1.当前上下文
以句点和正斜杠 (./) 作为前缀的表达式明确使用当前上下文作为上下文。例如,以下表达式引用当前上下文中的所有 元素:
./author
注意,此表达式等效于以下表达式:
author
3.2.文档根
以正斜杠 (/) 为前缀的表达式使用文档树的根作为上下文。例如,以下表达式引用此文档根的 元素:
/bookstore
3.3.根元素
使用正斜杠后接星号 (/*) 的表达式将使用根元素作为上下文。例如,以下表达式查找文档的根元素:
/*
3.4.递归下降

#### 用双正斜杠 (//) 的表达式指示可以包括零个或多个层次结构级别的搜索。如果此运算符出现在模式的开头,上下文相对于文档的根。例如,以下表达式引用当前文档中任意位置的所有 元素:
#### //author

.// 前缀指示上下文从层次结构中当前上下文所指示的级别开始。
3.5.特定元素
以元素名开头的表达式引用特定元素的查询,从当前上下文节点开始。例如,以下表达式引用当前上下文节点中 元素内的
XPath 表达式是使用下表中所示的运算符和特殊字符构造的。
运算符和特殊字符:
/ 子运算符;选择左侧集合的直接子级。此路径运算符出现在模式开头时,表示应从根节点选择该子级。
// 递归下降;在任意深度搜索指定元素。此路径运算符出现在模式开头时,表示应从根节点递归下降。
. 指示当前上下文。
.. 当前上下文节点的父级。
* 通配符;选择所有元素,与元素名无关。
@ 属性;属性名的前缀。
@* 属性通配符;选择所有属性,与名称无关。
: 命名空间分隔符;将命名空间前缀与元素名或属性名分隔。
( ) 为运算分组,明确设置优先级。
[ ] 应用筛选模式。
[ ] 下标运算符;用于在集合中编制索引。
+ 执行加法。
- 执行减法。
div 根据 IEEE 754 执行浮点除法。
* 执行乘法。
mod 从截断除法返回余数。
通配符
通过使用通配符 * 集合,不使用元素名即可引用元素。* 集合引用作为当前上下文的子级的所有元素,与名称无关。
//例如:
   author/* 
   <author> //元素的所有元素子级。

   book/*/last-name
   // 所有作为 <book> 元素的孙级的 <last–name> 元素。

   */*
   // 当前上下文的所有孙级元素。

   my:book
   my  //命名空间中的 <book> 元素。

   my:*
   my  //命名空间中的所有元素。
 //属性
XPath  //使用 @ 符号表示属性名。属性和子元素应公平对待,两种类型之间的功能应尽可能相当。
例如:
   @style
   // 当前元素上下文的 style 属性。

  price/@exchange
    //当前上下文中 <price> 元素的 exchange 属性。

   book/@style
     //所有 <book> 元素的 style 属性。

    @*
     //当前上下文节点的所有属性。

    @my:*  
    my  //命名空间中的所有属性。不包括 my 命名空间中的元素的未限定属性。

    //注意:
    // 属性不能包含子元素,所以,如果对属性应用路径运算符,将出现语法错误。此外,不能对属性应用索引,因为根据定义,不为属性定义任何顺序。
   price/@exchange/total
比较
运算符:(具体可见XPath帮助文档)
and 逻辑与
or 逻辑或
not() 非
= 相等
!= 不相等
< 小于
<= 小于或等于
> 大于
<= 大于或等于
| 集运算;返回两个节点集的联合

4.XPath在dom4j中如何使用

1)在项目中导入xpath支持jar包。jaxen-1.1-beta-6.jar
2)使用dom4j提供的xpath方法
selectNodes(xpath表达式): 查询符合条件的多个节点对象 。
selectSingleNode(xpath表达式) 查询符合条件的一个节点对象。

5.如何使用XPath提取数据?

实例演示:
user.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user id="1" username="Cecilia" password="123" email="582125509@qq.com"/>
    <user id="2" username="aaa" password="456" email="123456789@136.com"/>
    <user id="3" username="bbb" password="789" email="987654321@126.com"/>
</users>

测试类

/**
 * 使用XPath提取XML数据
 * @author 芷若初荨
 *@Exception Exception
 */
 //需要导包:jaxen-1.1-beta-7
public class XPathExtractXml {
    public static void main(String[] args) throws Exception {
        SAXReader reader=new SAXReader();
        Document document=reader.read(new File("msg/book.xml"));

        String value=document.selectSingleNode("//作者").getText();
        System.out.println(value);
    }
}

6.如何使用Xpath匹配用户名和密码的验证?

/**
 * 查找users.xml文件是否和用户匹配的用户名和密码
 * @author 芷若初荨
 *
 */
public class XPathAnalysisXMLTest {
    public static void main(String[] args) throws Exception {
        String username="aaa";
        String password="456";
//      检测XML文档是否有匹配的用户名和密码
        SAXReader reader=new SAXReader();
        Document document=reader.read(new File("msg/user.xml"));
        Node node=document.selectSingleNode("//user[@username="+username+" and @password="+password+"]");
//      //"user[@username+"+username+"and @password"+password+"]"
        if(node==null){
            System.out.println("用户名或密码错误!!");
        }else{
            System.out.println("登陆成功!");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值