非嵌套(同级)元素的Xpath

时间:2019-06-25 15:22:00

标签: xpath

原始文档:

<div class='master'>
 <div class='recordBlock' id='gf5rtf4'/>
 <div id='d3dre'>First block</div>
 <div id='fa2s2w'>Second Block</div>
 <div class='recordBlock' id='fred11' />
 <div id='asd423'>Third block</div>
</div>

我正在尝试找出id为gf5rtf4的recordBlock下的两个div元素的xpath,也就是说,只有id为d3dre和fa2s2w的div,而不是第三个div asd423。

尽管这不能明确,因为我还需要使用相同的Xpath表达式对ID为fred11的recordBlock运行,以返回ID为asd423的元素。

建议的链接不符合问题标准,表达的链接涉及嵌套元素,我提出的问题提出了非嵌套元素的问题(在层次结构中的同一级别),但由class = recordBlock分隔并带有指定的id值,以返回分隔符之间的同级。

老实说,我什至不知道如何开始,每个recordBlock下的divs在概念上都是嵌套的,但在文档中却不是这样(可以看到)

2 个答案:

答案 0 :(得分:1)

这里是xpath,用于获取两个节点之间的同级div。

使用Xpath 1:

//div[@class='master']/div[not(@class = 'recordBlock')][ count(../div[@class='recordBlock'][3]/preceding-sibling::*) = count(preceding-sibling::div[@class='recordBlock'][1] /following-sibling::div[@class='recordBlock'][1]/preceding-sibling::*)]

Xpath 1的ScreenShot enter image description here

================================================ ==========================

使用Xpath 2:

注意:我们已将 x 替换为下一个recordBlock位置,直到您需要div为止。

//div[@class='master']/div[not(@class = 'recordBlock')][generate-id(../div[@class='recordBlock'][x])= generate-id(preceding-sibling::div[@class='recordBlock'][1]/following-sibling::div[@class='recordBlock'][1])]

如果您希望直到第二个recordBlock的兄弟姐妹(意味着第一和第二记录块之间的任何内容),请检查以下xpath。

//div[@class='master']/div[not(@class = 'recordBlock')][generate-id(../div[@class='recordBlock'][2]) = generate-id(preceding-sibling::div[@class='recordBlock'][1]/following-sibling::div[@class='recordBlock'][1])]

输出: enter image description here

我知道您正在思考最后一个应该给什么,就像我上面提到的,它总是+1,因此您必须指定3any number >2应该起作用。 / p>

//div[@class='master']/div[not(@class = 'recordBlock')][generate-id(../div[@class='recordBlock'][3]) = generate-id(preceding-sibling::div[@class='recordBlock'][1]/following-sibling::div[@class='recordBlock'][1])]

输出enter image description here

请注意::无论指定项目(在这种情况下为recordBlock之间的选择性节点的数量(在这种情况下为div),该方法都将起作用。

enter image description here

答案 1 :(得分:0)

您应该尝试类似的操作

//div[@class="recordBlock"]/following-sibling::div[not(@class)]

输出为...

  

第一块第二块第三块