C# XPath或,可选

C# XPath或,可选,c#,xpath,html-agility-pack,C#,Xpath,Html Agility Pack,我使用CSharp、XPath和HTMLAgility包。我使用XPath字符串,例如: "//table[3]/td[1]/span[2]/text() | //table[6]/td[1]/span[2]/text()" "//table[8]/td[1]/span[2]/text() | //table[10]/td[1]/span[2]/text()" 区别仅在于表格编号。是否可以使用其他XPath函数替换XPath或 我实际做的是:使用第一个XPath字符串(我有表号3和表号6),我

我使用CSharp、XPath和HTMLAgility包。我使用XPath字符串,例如:

"//table[3]/td[1]/span[2]/text() | //table[6]/td[1]/span[2]/text()"
"//table[8]/td[1]/span[2]/text() | //table[10]/td[1]/span[2]/text()"
区别仅在于表格编号。是否可以使用其他XPath函数替换XPath或

我实际做的是:使用第一个XPath字符串(我有表号3和表号6),我提取一个值。使用第二个XPath字符串(表号为8和10),我提取另一个值


关于性能的另外一个问题是:XPath字符串
//表[8]/td[1]/span[2]/text()
是否比XPath字符串
//表[8]/td[1]/span[2]/text()//表[10]/td[1]/span[2]/text()快?我问这个问题是因为我有很多XPath字符串用于很多值,如果有差异,这意味着我需要尝试其他方法。我现在不能测量,这就是为什么我问你这个问题来分享你的经验。

首先,
//表[6]
看起来很奇怪。你确定你的意思不是
(//表)[6]
?(第一个表选择其父表的第六个子表;第二个表选择文档中的第六个表。)我将假设后者

在XPath2.0中,您可以编写

(//table)[position()=(3,6,8,10)]/td[1]/span[2]/text()
在1.0中,这必须是

(//table)[position()=3 or position()=6 or position()=8 or position()=10]
    /td[1]/span[2]/text()
或者(在任一版本中)您可以编写

((//table)[3] | (//table)[6] | (//table)[8] | (//table)[10])/td[1]/span[2]/text()

如果不知道您使用的是什么XPath实现,就无法回答您关于性能的问题。

为什么不使用[3 | 6]而不是整个或?@然而:那甚至不是一个有效的XPath。您只能在两个节点集之间使用或,而不仅仅是任何任意表达式。如果Html允许,您可以使用其他XPATH表达式。你能分享一些Html代码吗?谢谢你的回答。如何知道我使用的是什么版本的XPath?“知道您使用的是什么XPath实现”是什么意思?我在CSharp和htmlagilitypack中使用XPath如果我没有XPath2.0,我如何安装它?