我在通过其他方式找到的显式XPath检索单个节点时遇到问题。我有节点,我可以获得它的XPath,但是当我尝试再次通过node.XPath检索同一节点时,它给出了“表达式必须评估为节点集”错误。这不应该工作吗?我在C#btw中使用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);
BTW:这是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]"
答案 0 :(得分:0)
我能够通过用函数text()替换#text来使它工作。我不确定为什么它不会只是首先以这种方式发出XPath。
HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath.Replace("#text","text()");
答案 1 :(得分:0)
你的XPath以“#text [2]”结尾,这意味着“第二个'文本'属性”。属性不是节点,它们是节点元数据 这是我在XPath中遇到的一个常见问题:想要XPath操作绝对必须提取节点时属性的值。
我用于此的解决方案是使用检测和删除字符串属性部分的内容(通过myXPathString.LastIndexOf(“#”)方法调用)包装我的XPath获取,然后使用截断的myXPathString获取节点并收集所需的属性值作为第二步。
希望有所帮助,
Ĵ