我有一个导航树的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] 但我无法这样做
答案 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