如何使XPath表达式更通用?

时间:2011-04-05 00:19:09

标签: xpath xpathnavigator

我有一个导航树的xpath表达式,其中包含一些可以添加的子分支:

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]/div/div[2]/div/div/div/div[3]/div/**div[1]**/div[1]/table/tbody/tr/td[2]/div[@id='gwt-uid-17']/a

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]/div/div[2]/div/div/div/div[3]/div/**div[2]**/div[1]/table/tbody/tr/td[2]/div[@id='gwt-uid-58']/a

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]/div/div[2]/div/div/div/div[3]/div/**div[3]**/div[1]/table/tbody/tr/td[2]/div[@id='gwt-uid-83']/a

我需要使它类似于下面给出的通用语句但不能这样做

//div[@role='treeitem']/a[text()='Situation']/ancestor::table//div[1]//a

有人可以解释一下吗?

从评论中更新

  

我可以看到3个子节点[div [1] in   第一个表达式,div [2]在第二个   表达式和div [3]在第三   表达]所以不要写直到   div [100]我想把它作为div [%d]   但我无法这样做

3 个答案:

答案 0 :(得分:1)

如果id属性的值唯一标识元素,那么精确选择所有这三个a元素的短表达式为:

//div[@id='gwt-uid-17' or @id='gwt-uid-58' or @id='gwt-uid-83']/a

但是,评估//缩写可能非常低效,不建议使用。

选择这三个a元素并且效率更高的单个XPath表达式是

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]
   /div/div[2]/div/div/div/div[3]/div/div[not(position() >3)]/div[1]
    /table/tbody/tr/td[2]
     /div[@id='gwt-uid-17' or @id='gwt-uid-58' or @id='gwt-uid-83']/a

答案 1 :(得分:0)

您需要的只是用于唯一标识所需节点的最短表达式。例如,表达式

//div[@id='gwt-uid-17']/a

相当于上面的第一行,因为id是唯一的(假设)。

如果您想定位“情境”链接下的链接,可以尝试

//a[text()='Situation']//table//a[1]

但是我需要知道XML是否正确。

答案 2 :(得分:0)

假设这是有效的XHTML,并且id实际上是唯一标识符,您不需要任何高于指定div的层次结构,并且可以使用像这样的XPath表达式:

//div[@id='gwt-uid-17']/a

根据您的语言绑定,您还可以在XPath表达式中使用变量,因此可以使用如下通用表达式:

//div[@id='$theDivIWant']/a