1小时学会XPath的基本使用

本文详细介绍了XPath语言的基础用法,包括选取节点的语法表达式如nodename、/、//、.、..和@,以及XPath的内建函数,如text()、contains()、last()和position()等。通过示例展示了如何进行文本匹配、模糊匹配和位置匹配,并给出了实际的XML文档片段进行实战演示。
摘要由CSDN通过智能技术生成

前言

XPath是一门在XML文档查找元素信息的语言,在这里我们将学习XPath的基本用法。

选取节点常用的语法表达式

表达式描述
nodename选取此节点的所有子节点。
/从根节点选取(取子节点)。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。
  • 注意
    • 只要/后面不是非节点名称比如//li/@class代表li节点的class属性)或者//li/..li节点的父节点)那么就不使用路径匹配
    • 假如/后面是节点名称,那么就使用路径匹配,比如//li/p匹配li节点下的p节点
    • 也可以混合使用比如可以这样//li/..匹配li节点的父节点);或者可以这样//li/../li[2]匹配li节点的父节点的第2个li节点,也就是li的兄弟节点);还可以这样//li/.匹配li节点的当前节点,也就是我匹配我自己,等同于//li

XPath内建函数

Xpath 提供 100 多个内建函数,这些函数给我们提供了很多便利,比如实现文本匹配、模糊匹配、以及位置匹配等,下面介绍几个常用的内建函数。

函数名称xpath表达式示例示例说明
text()//p[1]/text()文本匹配,表示值取第一个p节点中的文本内容
contains()//*[contains(@class,"colo")]模糊匹配,表示选择 class中包含“colo”的所有 节点。
last()//*[@class='web'][last()]位置匹配,表示选择@class='web’的最后一个节点。
position()//*[@class='site'][position()<=2]位置匹配,表示选择@class='site’的前两个节点。

实例

<ul class="BookList">
  <li class="book1" id="book_01" href="http://www.testwenxi.net/">
        <p class="name">c语言小白变怪兽</p>
        <p class="model">纸质书</p>
        <p class="price">80元</p>
        <p class="color">红蓝色封装</p>
    </li>
  
    <li class="book2" id="book_02" href="http://www.testwenxi.net/">
        <p class="name">Python入门到精通</p>
        <p class="model">电子书</p>
        <p class="price">45元</p>
        <p class="color">蓝绿色封装</p>
    </li>
</ul>
  • 表达式://li
    解释:在所有节点查找为li的节点
    结果如下:

    <li class="book1" id="book_01" href="http://www.testwenxi.net/">&#13;
            <p class="name">c语言小白变怪兽</p>&#13;
            <p class="model">纸质书</p>&#13;
            <p class="price">80元</p>&#13;
            <p class="color">红蓝色封装</p>&#13;
        </li>
    <li class="book2" id="book_02" href="http://www.testwenxi.net/">&#13;
            <p class="name">Python入门到精通</p>&#13;
            <p class="model">电子书</p>&#13;
            <p class="price">45元</p>&#13;
            <p class="color">蓝绿色封装</p>&#13;
        </li>
    
  • 表达式://li[1]/p
    解释:在所有节点查找第一个li节点下的p节点
    结果如下:

    <p class="name">c语言小白变怪兽</p>
    <p class="model">纸质书</p>
    <p class="price">80元</p>
    <p class="color">红蓝色封装</p>
    
    
  • 表达式://@class
    解释:在所有节点查找包含class属性的节点
    结果如下:

     class="BookList"
     class="book1"
     class="name"
     class="model"
     class="price"
     class="color"
     class="book2"
     class="name"
     class="model"
     class="price"
     class="color"
    
  • 表达式://li[1]/@class
    解释:在所有节点查找第一个li节点的class属性注意:这里很多小伙伴会以为是查找li节点下的class属性,但其实只要/后面不是非节点名称比如li/@class或者li/..是代表li节点的class属性和li节点的父节点
    结果如下

     class="book1"
    
  • 表达式://li[1]/../@class
    解释:在所有节点查找第一个li节点的父节点class属性
    结果如下

     class="BookList"
    
  • 表达式://li[1]/../li[2]/@class
    解释:在所有节点查找第一个li节点的兄弟li节点的class属性
    结果如下

    class="book2"
    
  • 表达式://*[@class="price"][1]
    解释:在所有节点查找class属性等于price的第一个节点
    结果如下

    <p class="price">80元</p>
    
  • 表达式://*[@class="book2" and @id="book_02"]
    解释:在所有节点查找class属性等于"book2"和id属性等于"book_02"的节点,除了and之外还有or可使用
    结果如下

    <li class="book2" id="book_02" href="http://www.testwenxi.net/">&#13;
        <p class="name">Python入门到精通</p>&#13;
        <p class="model">电子书</p>&#13;
        <p class="price">45元</p>&#13;
        <p class="color">蓝绿色封装</p>&#13;
    </li>
    
  • 表达式://p[1]/text()
    解释:第一个p节点中的文本内容
    结果如下

    c语言小白变怪兽
    
  • 表达式://*[contains(@class,"colo")]
    解释:模糊匹配,表示选择 class中包含“colo”的所有 节点。
    结果如下

    <p class="color">红蓝色封装</p>
    <p class="color">蓝绿色封装</p>
    
  • 表达式://p[text()="电子书" or text()="纸质书"]
    解释:查找p节点下text是电子书或纸质书的节点
    结果如下

    <p class="model">纸质书</p>
    <p class="model">电子书</p>
    
    
  • 表达式://p/../../@class
    解释:在p节点上查找它父节点的父节点的class属性,也就是ul节点的class属性
    结果如下:

    [
    	"BookList"
    ]
    

其他较少用到的语法:

# 选择不包含class属性的节点
var result = node.SelectNodes(".//span[not(@class)]");
# 选择不包含class和id属性的节点
var result = node.SelectNodes(".//span[not(@class) and not(@id)]");
# 选择不包含class="expire"的span
var result = node.SelectNodes(".//span[not(contains(@class,'expire'))]");
# 选择包含class="expire"的span
var result = node.SelectNodes(".//span[contains(@class,'expire')]")

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值