XPath 读书笔记

<?xml version="1.0" encoding="ISO-8859-1"?>
<books>
<book type=”hardback”>
<title>Atlas Shrugged</title>
<author>Ayn Rand</author>
<isbn>0525934189</isbn>
</book>
<book type=”paperback”>
<title>A Burnt-Out Case</title>
<author>Graham Greene</author>
<isbn>0140185399</isbn>
</book>
</books>

每个结点可以是以下七个类型之一:根(root)、元素(element)、属性(attribute)、正文(text)、命名空间(namespace)、处理指令(processing instruction)和注释(comment)


所有的book元素://books/book
双正斜杠(//)表示返回XML文档中的所有符合查找准则的元素,而忽略文档中元素的位置级别。


所有的ISBN元素:/books/book/isbn
返回如下的元素:
<books>
<book type=”hardback”>
<isbn>0525934189</isbn>
</book>
<book type=”paperback”>
<isbn>0140185399</isbn>
</book>
</books>


所有标题为Atlas Shrugged的book元素:/books/book[title=”Atlas Shrugged”]


/books/book[author]
方括号符号让你使用属性作为查找准则


所有type属性值为hardback的书://book[@type=”hardback”]
返回下面的元素:
<book type=”hardback”>
<title>Atlas Shrugged</title>
<author>Ayn Rand</author>
<isbn>0525934189</isbn>
</book>


方括号符号在XPath文档中称为谓词,方括号的另外一个用途是标识需要检索的项数。
返回第一个book元素:/books/book[1]
<book type=”hardback”>
<title>Atlas Shrugged</title>
<author>Ayn Rand</author>
<isbn>0525934189</isbn>
</book>


用通配符(*)可以很容易的检索到在根结点下的所有元素。

所有的book元素:/books/*


所有属性type值为hardcover或softcover的book元素://books/book[@type=”hardcover”] | //books/book[@type=”softcover”]
符号(|)与逻辑OR操作符相同。


语句的第一个字符决定参考点,以正斜杠(/)开始的语句被看作查询时将使用绝对路径。


使用相对路径的例子:
在当前的参考点下开始查找
book/*


单个圆点表示选择当前结点,双圆点表示选择父结点。


当前结点的父结点的所有子结点:
../*

==============================================================================================================
<A id="a1">
  <B id="b1">
    <C id="c1">
      <B name="b"/>
      <D id="d1"/>
      <E id="e1"/>
      <E id="e2"/>
    </C>
  </B>
  <B id="b2"/>
  <C id="c2">
    <B/>
    <D id="d2"/>
    <F/>
  </C>
  <E/>
</A>

/A/B/C[1] A元素→B元素→C元素的第一个子元素 name值为b的B元素

/A/B/C[last()] A元素→B元素→C元素的最后一个子元素 id值为e2的E元素

/A/B/C[position()>1] A元素→B元素→C元素之下的位置号大于1的元素 id值为d1的D元素和两个具有id值的E元素

//B[@id] 所有具有属性id的B元素  id值为b1和b2的两个B元素
//B[@*]  所有具有属性的B元素  两个具有id属性的B元素和一个具有name属性B元素
//B[not(@*)] 所有不具有属性的B元素  A元素→C元素下的B元素
//B[@id="b1"] id值为b1的B元素   A元素下的B元素


//E/parent::*  所有E节点的父节点元素  id值为a1的A元素和id值为c1的C元素

//F/ancestor::*  所有F元素的祖先节点元素  id值为a1的A元素和id值为c2的C元素

/A/child::*  A的子元素  id值为b1、b2的B元素,id值为c2的C元素,以及没有任何属性的E元素

/A/descendant::* A的所有后代元素  除A元素以外的所有其它元素

//F/self::*  所有F的自身元素  F元素本身

//F/ancestor-or-self::*  所有F元素及它的祖先节点元素  F元素、F元素的父节点C元素和A元素

/A/C/descendant-or-self::* 所有A元素→C元素及它们的后代元素 id值为c2的C元素、该元素的子元素B、D、F元素

/A/C/following-sibling::* A元素→C元素的紧邻的后序所有兄弟节点元素 没有任何属性的E元素

/A/C/preceding-sibling::* A元素→C元素的紧邻的前面所有兄弟节点元素 id值为b1和b2的两个B元素

/A/B/C/following::*  A元素→B元素→C元素的后序的所有元素  id为b2的B元素、无属性的C元素、无属性的B元素、id为d2的D元素、无属性的F元素、无属性的E元素。

/A/C/preceding::*  A元素→C元素的前面的所有元素   id为b2的B元素、id为e2的E元素、id为e1的E元素、id为d1的D元素、name为b的B元素、id为c1的C元素、id为b1的B元素

posted @ 2006-11-06 20:56  RobotTech  阅读(304)  评论(0编辑  收藏  举报