XPath定位学习记录
http://www.w3school.com.cn/example/xmle/books.xml
<!-- Copyright w3school.com.cn -->
<!--  W3School.com.cn bookstore example  -->
<bookstore>
    <book category="children">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
        <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="web" cover="paperback">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
    <book category="web">
        <title lang="en">XQuery Kick Start</title>
        <author>James McGovern</author>
        <author>Per Bothner</author>
        <author>Kurt Cagle</author>
        <author>James Linn</author>
        <author>Vaidyanathan Nagarajan</author>
        <year>2003</year>
        <price>49.99</price>
    </book>
</bookstore>
上面代码为下面所有例子的Xml文档
一、Xpath术语
●在XPath中,有7种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点
  1、元素节点(Element Nodes)
	元素节点对应于文档中的第一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI(统一资源标识符),另一部分是本地的命名。
  2、属性节点(Attribute Nodes)
	每一个元素节点都有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父节点的子节点。这就是说,通过查找元素的子节点可以匹配出元素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性
  3、文本节点(Text Nodes)
	文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。
  4、命名空间节点(NameSpace Nodes)
    每一个元素节点都有一个相关联的命名空间节点集。在Xml文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。
  5、处理指令节点(Processing Instruction Nodes)
    处理指令节点对应于Xml文档中的每一条处理指令。它也有扩展名,扩展名和本地命名指向处理对象,而命名空间部分为空。
  6、注释节点(Comment Nodes)
    注释节点对应于Xml文档中的注释
  7、文档/根节点(Root Nodes)
    根节点是一棵树的最上层,根节点是唯一的。树上的其他所有元素节点都是它的子节点或后代节点。
	
●Xml文档是被作为节点树来对待的
●树的根被称为文档节点或根节点
二、节点
●节点 (Node)
  <bookstore> 文档节点或根节点
  <book> 是<bookstore>的子节点
  <book>下有四个子节点,为:<title> <author> <year> <price>
●基本值:无父或无子的节点
  如:Jk . Rowling  2005 
●父节点:每个元素以及属性都有一个父节点
  如:book元素是title author year price元素的父节点
三、选取节点
1、// 相对路径查找
  如://book  找到所有的book
      //year   找到所有的year
2、 /  从根节点开始查找
  如: /bookstore  找到bookstore
       /bookstore/book  找到bookstore下的book , book必须在bookstore下
	   /book 则不会找到book,必须从根节点开始 ,即bookstore
	   /bookstore/book[@category='cooking'] 找到名为cooking 的书   可使用等或不等 = !=
	   /bookstore/book[@cover]  找到所有包含cover属性的书
	   /bookstore/book[@cover and @category]  没有唯一属性时可以使用组合定位    and or not
	   
3、. 表示当前路径  相当于根节点
4、.. 表示当前节点的父节点
  如: /bookstore/book/pirce[.='29.99']  找到价格为29.99的书
       /bookstore/book/price[.='29.99']/..    找到价格为29.99的书的父元素 即 book
	   /bookstore/book/price[.='29.99']/../title  找到价格为29.99的书的名称
5、 @  表示选取属性
  如: //@lang  找到所有的lang属性
       //@lang[1] 找到每个元素下的第一个lang属性 (会选中多个,如果要定位可以和其他进行组合)
	   //book[@category='children']//@lang    找到书名为children下的lang属性
6、 节点名称  
    bookstore  找到bookstore节点
	bookstore/book   找到book元素
7、not 表示没有这个属性
  如: //book/*[not(@lang)]  找到没有lang属性的元素, * 表示所有元素
	
练习:找到最一个title
//title[.='XQuery Kick Start']
//book[@category='web' and not(@cover)]/title
//author[text()='James McGovern']/../title
/bookstore/book/title[.='XQuery Kick Start']
/bookstore/book/price[.='49.99']/../title
/bookstore/book[last()]   
/bookstore/book[position()=4]  使用位置函数
8、* 表示当前路径下的所有文档	   
/bookstore/book/*    找到book下的所有子元素
/bookstore/book/*[.="2003"]    *与属性结合
	   
9、运算符 | + - * div = != < <= > >= or and mod 
//price[.>30]  价格大于30
//price[.<=40] 价格小于等于 40
//price[text()!=50]  这里的text() 和 . 的作用相同
10、模糊查询 contains()
//book/*[contains(text(),"De")]
//book/*[contains(@category,"oo")]
11、亲属关系  轴   先找到一个好找的元素,再基于该元素找到其他难定位的元素
parent::*  表示当前节点的父节点元素
ancestor::*  表示当前节点的祖先节点元素
child::*  表示当前节点的子节点元素
descendant::*  表示当前节点的所有后代元素
self::*   表示当前节点的自身元素
ancestor-or-self::*  表示当前节点及它的祖先节点的元素
descendant-or-self::*  表示当前节点及它的后代节点的元素
following-sibling::*  表示当前节点的后序所有兄弟节点元素
preceding-sibling::*  表示当前节点的前面所有兄弟节点元素
following::*  表示当前节点的后序所有元素
preceding::*  表示当前节点的前面所有元素
//price[.=39.95]/preceding-sibling::year
练习:基于第三本书,用轴的方法找到前一本、后一本、父节点、子节点中的year
//book[@category="web" and @cover="paperback"]/following-sibling::book[1]  前一本
//book[@category="web" and @cover="paperback"]/preceding-sibling::book[1]  后一本
//book[@category="web" and @cover="paperback"]/parent::bookstore   父节点
//book[@category="web" and @cover="paperback"]/child::year  子节点中的year
//book[3]/preceding-sibling::book[@category="cooking"]   前一本
//book[3]/following-sibling::book[1]  后一本
//book[3]/parent::bookstore    父节点
//book[3]/child::year    子节点中的year
孙节点:
/bookstore/descendant::year[1]   孙节点的第一个year   跨过了book
祖先节点:
//price[.="29.99"]/ancestor::bookstore   price的祖先节点,跨过了book
12、函数
last()
postion()
/bookstore/book[last()]   
/bookstore/book[position()=4
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号