1

我在通过其他方式找到的显式 XPath 检索单个节点时遇到问题。我有节点,我可以得到它的 XPath,但是当我这次尝试通过 node.XPath 再次检索同一个节点时,它给出了“表达式必须评估为节点集”错误。这不应该工作吗?我在 C# btw 中为 HtmlDocument 使用 HtmlAgilityPack。

HtmlDocument doc = new HtmlDocument();
doc.Load(@"..\..\test1.htm");
HtmlNode node = doc.DocumentNode.SelectSingleNode("(//node()[@id='something')])[first()]");
HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath);

顺便说一句:这是 node.XPath 的值:

"/html[1]/body[1]/table[1]/tr[1]/td[1]/div[1]/div[1]/div[2]/table[1]/tr[1]/td[1]/div[1]/div[1]/table[1]/tr[1]/td[1]/div[1]/div[1]/div[4]/div[2]/div[1]/div[1]/div[4]/#text[2]"
4

2 回答 2

0

您的 XPath 以“#text[2]”结尾,这意味着“第二个 'text' 属性”。属性不是节点,它们是节点元数据。
这是我在使用 XPath 时遇到的一个常见问题:想要一个属性的值,而 XPath 操作绝对必须提取一个节点。

我为此使用的解决方案是用检测和剥离字符串属性部分的东西(通过 myXPathString.LastIndexOf("#") 方法调用)包装我的 XPath 获取,然后使用截断的 myXPathString 来获取节点并收集所需的属性值作为第二步。

希望有帮助,
J

于 2011-01-07T19:25:49.040 回答
0

我可以通过用函数 text() 替换 #text 来让它工作。我不确定为什么它一开始不只是以这种方式发出 XPath。

HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath.Replace("#text","text()");
于 2010-08-15T03:30:32.933 回答