XML学习笔记(XPath中一个容易混淆的谓词)

先附上相关的XML文件,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<列车时刻表>
  <列车 类别="特快" 车厢数目="20节车厢">
    <列车号码>152次</列车号码>
    <始发时间>09:12</始发时间>
    <到达时间>19:23</到达时间>
    <始发站>北京</始发站>
    <终到站>上海</终到站>
  </列车>
  <列车 类别="普快" 车厢数目="12节车厢">
    <列车号码>168次</列车号码>
    <始发时间>10:12</始发时间>
    <到达时间>21:36</到达时间>
    <始发站>沈阳</始发站>
    <终到站>南京</终到站>
  </列车>

</列车时刻表>

要讨论的是下面两个XPath路径表达式:
第一个:/列车时刻表/列车/始发站[position()=1]
第二个: (/列车时刻表/列车/始发站)[position()=1]
两者的区别是第二个是第二个多了个括号。

先来看看API解析的结果:

第一个表达式的解析结果:


第二个表达式的解析结果:


两者的解析结果的区别在于,第一个表达式所返回的节点集中含有2个节点(名字都为“始发站”,其中一个的内容是"北京“,而另一个的内容是沈阳);第二个表达式所返回的节点集中仅含有1个节点集(名字为“始发站”,内容是"北京“)。

下面来分析一下这两个表达式的差异。
     先来说第二个表达式,因为它比较容易理解:
(/列车时刻表/列车/始发站)[position()=1],首先解析的是括号中的路径  (/列车时刻表/列车/始发站) 解析结果中得到了2个节点(名字都为“始发站”,其中一个的内容是"北京“,而另一个的内容是沈阳),然后再处理谓词[position()=1],筛选得出上述结果中的第一个节点,即内容为“北京”的名字为“始发站”的节点。所以整个表达式结果中仅包含1个节点名字为“始发站”,内容是"北京“
    
    现在再回头看第一个表达式
/列车时刻表/列车/始发站[position()=1],如果不看它的谓词[position()=1]的话,/列车时刻表/列车/始发站 返回一个包含2个节点的节点集(名字都为“始发站”,其中一个的内容是"北京“,而另一个的内容是沈阳),如果加上它的谓词[position()=1],需要单独地看这2个“始发站”节点中的每一个,筛选的条件是,其中的每一个都必须分别是相对于其所在的父元素“列车”元素下的,名为“始发站”的素集合中的第1个。如图所示:


由于每个“列车”元素下都有且仅有一个“始发站”元素,所以如果把表达式改为 
        
 /列车时刻表/列车/始发站[position()=2]
      的话,结果将返回0个节点,如下图所示,因为在一个“列车”元素中不存在第二个“始发站”的元素。


转载于:https://my.oschina.net/JiamingMai/blog/185454

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值