c# - 将 XPath 转换为 LINQ

标签 c# linq xpath html-agility-pack

我在将以下 XPath 查询转换为 LINQ 时遇到了问题。我不确定如何处理 position() 方法,因为我找不到 LINQ 等效方法。

(//table[@border='1'])[1]//tr[position() > 1 and position() < last()]

此外,我在查询中找不到 .// 的 LINQ 版本:

.//div[span/@title='Event group']

有人可以帮我翻译这些吗?

最佳答案

这部分你的 XPath (//table[@border='1'])[1] , 可以大致翻译成以下 LINQ(假设 docXDocument 的一个实例):

doc.Descendants("table")
   .Where(o => (string)o.Attribute("border") == "1")
   .FirstOrDefault()?

还有这个表达式 //tr[position() > 1 and position() < last()] , 大致翻译为:

.Descendants("tr").Where(o => {
    var trs = o.Parent.Elements("tr").ToList();
    var position = trs.IndexOf(o)+1;  //since XPath position index starts from 1
    return position > 1 && position < trs.Count;
})

从上面两个例子,你应该可以看出如何表达// , position() , 和 @attribute在林克。翻译你的第二个 XPath 留作练习 :)

关于c# - 将 XPath 转换为 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36562236/

相关文章:

c# - 如何构建具有多个 GroupBys 的 LINQ?

c# - 使用 Linq 获取与 ID 列表匹配的结果

python - 如何使用 Selenium 基于文本和类查找元素?

java - Selenium (Java): ordered list of webelements but with nested divs

selenium - Selenium和xPath-通过包含文本来定位链接

c# - DLL 中的单例类可以跨进程共享吗?

c# - 无论应用了多少次转换,如何拦截 IQueryable 中的元素?

c# - 使用 new() 或 default 初始化变量之间的区别?

c# - 这个 Lambda 表达式有什么问题?

c# - 将列表分解为一组索引列表