Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPath仅直接匹配后面的同级_Xpath - Fatal编程技术网

XPath仅直接匹配后面的同级

XPath仅直接匹配后面的同级,xpath,Xpath,我有以下几种HTML。内容按和元素分组,中间有 我正试图弄清楚如何构建一个XPath表达式,它允许我触发“id=foo”以返回带有“style=padding…”的兄弟s 获取是件小事。但是,我不能基于“style=padding…”只执行后面的兄弟姐妹,因为它会返回所有匹配的 我需要一种方法来返回匹配的s,直到我找到匹配“id=foo1”的兄弟姐妹。我很确定有一个简单的方法我不知道 <div id="foo">stuff...</div> <div style=

我有以下几种HTML。内容按
元素分组,中间有

我正试图弄清楚如何构建一个XPath表达式,它允许我触发
“id=foo”
以返回带有
“style=padding…”的兄弟
s

获取
是件小事。但是,我不能基于
“style=padding…”
只执行
后面的兄弟姐妹
,因为它会返回所有匹配的

我需要一种方法来返回匹配的
s,直到我找到匹配
“id=foo1”
的兄弟姐妹。我很确定有一个简单的方法我不知道

<div id="foo">stuff...</div>

<div style="padding:2px; ">stuff...</div>

<div id="foo1">stuff...</div>

<div id="foo">stuff...</div>

<div style="padding:2px; ">stuff...</div>
<div style="padding:2px; ">stuff...</div>
<div style="padding:2px; ">stuff...</div>

<div id="foo1">stuff...</div>
东西。。。
东西
东西
东西
东西
东西
东西
东西

给他们一个类名,而不是使用内联样式

我认为使用XPath查询是不可行的。它要求您记住所选div的索引(不太难),然后将其同级的索引与该div以及其后的第一个#foo1 div进行比较。如果可能的话,这是一个非常复杂的XPath查询。XPath不容易让您保留多个作用域来比较元素或属性

最好先选择两个分隔符div,然后匹配中间的分隔符div。这在代码中比在XPath中更容易实现


如果确实需要在XPath中执行此操作,则需要分隔符div具有不同的id(首先,具有相同id的多个元素无论如何都是无效的,因此请使用不同的元素或类名),然后以某种方式将div上的id或类名与填充匹配。换句话说,更改HTML以提供足够的引用,而不是尝试用XPath完全解决它。

有什么原因不能采用简单的方法来选择所有没有id属性的
div

div[not(@id)]
或者,可能是带有样式属性的
div
s

div[@style]
如果出于某种原因,这是不可接受的,你可以选择更像你所想的:

div[@style][following-sibling::div[@id='foo1']]
它获取所有
div
s的样式属性,这些属性位于
div
s之前,与特定id匹配。这就是您所要求的吗


我认为您的实际输入HTML没有您提供的示例那么简单,但是我列出的所有XPath表达式都适用于您的示例。如果您能提供更多关于您的预期输出以及您一直面临的问题的详细信息,那么我可以为您提供更多帮助。

您最好的长期选择是修复HTML。任何其他解决方案都是脆弱的。

一种看起来不太好看的方法是如下所示(请注意,它是基于这样一种假设,即您确实有多个
具有相同的
id
!):

XPath表达式的第一行接受第n个
的后续兄弟姐妹的任何
(这是您自己选择的全部)

然后,它为每个兄弟姐妹计算前面的兄弟姐妹,并仅匹配具有正确数字的兄弟姐妹,例如,比相应的兄弟姐妹本身多出一个兄弟姐妹。更改数字n以选择另一组

事实上,如果您的输入没有具有相同id的多个元素,则会变得简单得多:

//div[@style='padding…'][preceding-sibling::div[@id][1]/@id = 'foo']

这将选择前面的第一个
(具有id)的id值为
'foo'
。如前所述,这意味着只有一个
的id为
'foo'
,而前面的其他
没有id。

您应该能够构造一个基于“前同级”轴的谓词,并将其应用于使用“后同级”轴检索的节点集。但是,我不想尝试调试/维护该查询。如果您谈论的是xhtml,那么使用相同id的多个元素有效吗?(id=“foo”)。
//div[@style='padding…'][preceding-sibling::div[@id][1]/@id = 'foo']