如何使用 XPath 选择以下同级/XML 标记
Posted
技术标签:
【中文标题】如何使用 XPath 选择以下同级/XML 标记【英文标题】:How to select following sibling/XML tag using XPath 【发布时间】:2011-03-09 12:55:58 【问题描述】:我有一个 html 文件(来自 Newegg),它们的 HTML 组织如下。他们的规格表中的所有数据都是“desc”,而每个部分的标题都在“name.”中。下面是来自 Newegg 页面的两个数据示例。 p>
<tr>
<td class="name">Brand</td>
<td class="desc">Intel</td>
</tr>
<tr>
<td class="name">Series</td>
<td class="desc">Core i5</td>
</tr>
<tr>
<td class="name">Cores</td>
<td class="desc">4</td>
</tr>
<tr>
<td class="name">Socket</td>
<td class="desc">LGA 1156</td>
<tr>
<td class="name">Brand</td>
<td class="desc">AMD</td>
</tr>
<tr>
<td class="name">Series</td>
<td class="desc">Phenom II X4</td>
</tr>
<tr>
<td class="name">Cores</td>
<td class="desc">4</td>
</tr>
<tr>
<td class="name">Socket</td>
<td class="desc">Socket AM3</td>
</tr>
最后,我希望有一个用于 CPU 的类(已经设置),它由 Brand、Series、Cores 和 Socket 类型组成,用于存储每个数据。这是我能想到的唯一方法:
if(parsedDocument.xpath(tr/td[@class="name"])=='Brand'):
CPU.brand = parsedDocument.xpath(tr/td[@class="name"]/nextsibling?).text
并为其余的值执行此操作。我将如何完成下一个兄弟姐妹,有没有更简单的方法?
【问题讨论】:
【参考方案1】:我将如何完成下一个兄弟姐妹 有没有更简单的方法 这个?
您可以使用:
tr/td[@class='name']/following-sibling::td
但我宁愿直接使用:
tr[td[@class='name'] ='Brand']/td[@class='desc']
假设:
评估 XPath 表达式所依据的上下文节点是所有 tr
元素的父级 - 未在您的问题中显示。
每个tr
元素只有一个td
,class
属性值为'name'
,只有一个td
,class
属性值为'desc'
。
【讨论】:
请注意,您必须小心使用类。当您的“名称”类元素同时具有任何其他类时,td[@class='name']
将中断。详情请见this question。
@gm2008,是的,如果@class 属性的值中有多个类,则要使用的谓词是:contains(concat(' ', @class, ' '), ' name ')
。但在这个问题中,@class 属性确实只有单个值。
相对于一个元素:./following-sibling::td
@JohnGietzen, Re: "Relative to an element" -- 你的意思是如果 context 节点 是我们感兴趣的元素。在这种情况下你可以省略 @987654335 @ .另外,如果要选择紧随其后的兄弟,请使用:following-sibling::td[1]
,否则,如果有多个以下兄弟,则将全部选中。【参考方案2】:
试试following-sibling
轴 (following-sibling::td
)。
【讨论】:
【参考方案3】:为了完整性-添加到上面接受的答案-如果您对任何兄弟元素感兴趣,无论元素类型如何,您都可以使用变体:
following-sibling::*
【讨论】:
以上是关于如何使用 XPath 选择以下同级/XML 标记的主要内容,如果未能解决你的问题,请参考以下文章
无论特定 Id 如何,如何使用 XPath 选择类别 XML 节点?