代码之家  ›  专栏  ›  技术社区  ›  Dave Hunt

xpath中的//节点和/后代::节点有什么区别?

  •  29
  • Dave Hunt  · 技术社区  · 15 年前

    在使用Selenium定位网页中的元素时,我使用了大量的xpath,并且最近已经从使用node1//node2转向使用node1/后代::node2。这两种方法有什么区别?一个比另一个效率高吗?

    要演示的XML代码段示例:

    <div id="books">
      <table>
        <tr><td class="title">Lord of the Rings</td><td class="author">JRR Tolkein</td></tr>
        <tr><td class="title">The Hitch-Hikers Guide to the Galaxy</td><td class="author">Douglas Adams</td></tr>
      </table>
    </div>
    

    所以:

    id('books')//td[@class='title']

    或:

    id('books')/descendant::td[@class='title']
    4 回复  |  直到 8 年前
        1
  •  32
  •   Jonathan Fingland    15 年前

    看见 http://www.w3.org/TR/xpath#path-abbrev

    //只是后代::axis的缩写

    编辑

    引述:

    //para是/后代或self::node()/child::para的缩写

    也就是说,它指的是上下文节点的子节点或从上下文节点派生的任何节点的所有段落。据我所知,这可以翻译成上下文节点的任何子段。

        2
  •  11
  •   Zakaria Acharki    8 年前

    上下文组有区别。 //para[1] 是短的 /descendant-or-self::node()/child::para[1] 返回作为其父级的第一个子级的每个段落。 /descendant::para[1] 只返回整个子树中的第一个段落。

        3
  •  4
  •   Zakaria Acharki    8 年前

    以你为例

     id('books')//td[@class='title']
    

    还有:

     id('books')/descendant::td[@class='title']
    

    返回相同的结果。

    但事实上,就像之前已经说过的, id('books')//td[@class='title'] 方法 id('books')/descendant-or-self::node()/td[@class='title'] 这和 id('books')/descendant::td[@class='title'] 在概念上。

    请参见以下注释:

    注意:位置路径//第[1]段的含义与位置路径/后代::第[1]段的含义不同。后者选择第一个后代para元素;前者选择作为其父母的第一个para子元素的所有后代para元素。

    这张便条是从 http://www.w3.org/TR/xpath#path-abbrev

        4
  •  2
  •   Allain Lalonde    15 年前

    除了简洁,我不知道有什么不同。