【问题标题】:XPath OR, alternativeXPath 或,替代
【发布时间】:2011-06-21 19:16:23
【问题描述】:

我使用 CSharp、XPath 和 HTMLAgility Pack。我使用 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 字符串 //table[8]/td[1]/span[2]/text() 是否比 XPath 字符串 OR //table[8]/td[1]/span[2]/text() | //table[10]/td[1]/span[2]/text() 快?我问这个是因为我有很多很多值的很多 XPath 字符串,如果存在差异,这真的意味着我需要尝试别的东西。我现在无法进行测量,所以我问你这个问题是为了分享你的经验。

【问题讨论】:

  • 为什么不直接使用 [3|6] 而不是整体 or?
  • @Yet:那甚至都不是有效的 XPath。您只能在两个节点集之间使用 OR,而不是任意表达式。
  • 如果 Html 允许,您可以使用其他 XPATH 表达式。可以分享一些 Html 代码吗?

标签: c# xpath html-agility-pack


【解决方案1】:

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

在 XPath 2.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 实现,就无法回答您关于性能的问题。

【讨论】:

  • 感谢所有回答。如何知道我使用的是什么版本的 XPath?你所说的“知道你正在使用什么 XPath 实现”是什么意思?我将 XPath 与 CSharp 和 HTMLAgilityPack 一起使用
  • 如果我没有 XPath 2.0,我该如何安装它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2022-01-11
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多