1

我有一个导航树的 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],在第二个表达式中看到 div[2],在第三个表达式中看到 div[3]] 所以我不想写到 div[100] 我想把它作为 div[%d ] 但我不能这样做

4

3 回答 3

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
于 2011-04-05T03:07:51.003 回答
0

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

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

相当于上面的第一行,因为 ids 是唯一的(据说)。

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

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

但我需要查看 XML 才能知道这是否正确。

于 2011-04-05T00:48:48.797 回答
0

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

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

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

//div[@id='$theDivIWant']/a
于 2011-04-05T00:57:05.600 回答