XML
<root>
<p>nodea text 1</p>
<p>nodea text 2</p>
<nodea>
</nodea>
<p>nodeb text 1</p>
<p>nodeb text 2</p>
<nodeb>
</nodeb>
</root>
我想得到nodea或nodeb前面的第一个同级p标记(如果有)。例如,对于上面的xml,各个节点的前面的同级是
nodea前面的兄弟姐妹
^{pr2}$nodeb前面的同级
<p>nodeb text 1</p>
<p>nodeb text 2</p>
我尝试过下面的xpath,但是它给了我前面的p标记nodea而不是nodeb。在
nodeb = xml.find('nodeb')
nodeb.xpath('preceding-sibling::p[not(preceding-sibling::nodea)][1]')
如果节点前面没有前面的p标记,那么它应该返回空列表。例如,对于下面的xml,nodeb没有前面的同级p标记。在
<root>
<p>nodea text 1</p>
<nodea>
</nodea>
<nodeb>
</nodeb>
</root>
如果有人能解释我的xpath为什么不能工作,以及在编写xpath时应该记住什么?在
如果前面的同级元素是
p
元素,则可以选择preceding-sibling::*[1][self::p]
来选择前面的同级元素。在至于您的尝试,我认为如果您选择}元素之间的兄弟}同级,它们是文档顺序中的前两个
nodeb
元素,那么您需要选择preceding-sibling::p[preceding-sibling::nodea][1]
,因为您希望查看位于nodeb
和{p
。您的条件preceding-sibling::p[not(preceding-sibling::nodea)][1]
确实选择了没有前面的nodea
同级的{p
元素。在相关问题 更多 >
编程相关推荐