XPath 问题,获取“表达式必须求值为节点集”。错误

发布于 2024-09-14 07:44:43 字数 664 浏览 7 评论 0原文

我在通过已通过其他方式找到的显式 XPath 检索单个节点时遇到问题。我有 node 并且可以获取它的 XPath,但是当我尝试通过 node.XPath 再次检索同一节点时,它会给出“表达式必须计算为节点集”错误。这不应该起作用吗?顺便说一句,我在 C# 中使用 HtmlAgilityPack 作为 HtmlDocument。

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]"

I'm having trouble retrieving a single node by its explicit XPath that I have already found by other ways. I have node and I can get its XPath, but when I try to retrieve that same node again this time via node.XPath it gives the "expression must evaluate to a node-set" error. Shouldn't this work? I'm using HtmlAgilityPack in C# btw for the HtmlDocument.

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

BTW: this is the value of 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]"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

只有影子陪我不离不弃 2024-09-21 07:44:43

我可以通过用函数 text() 替换 #text 来使其工作。我不知道为什么它不首先以这种方式发出 XPath。

HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath.Replace("#text","text()");

I was able to get it working by replacing #text with the function text(). I'm not sure why it didn't just emit the XPath that way in the first place.

HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath.Replace("#text","text()");
帅的被狗咬 2024-09-21 07:44:43

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

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

希望有帮助,
J

Your XPath ends in "#text[2]", which means "the second 'text' attribute". Attributes aren't nodes, they're node metadata.
This is a common problem I've had with XPath: wanting the value of an attribute while the XPath operation absolutely has to extract a node.

The solution I've used for this is to wrap my XPath fetching with something that detects and strips off the attribute portion of the string (via a myXPathString.LastIndexOf( "#" ) method call) and then uses the truncated myXPathString to fetch the node and collect the desired attribute value as a second step.

Hope that helps,
J

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文