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