我在两个窗口中打开了一个HTML文档,我需要在两个窗口之间同步所选节点。
使用Html Agility Pack我试过了:
HtmlNode myNode = GetSomeCertainNode();
string xpath = myNode.XPath; //xpath = "/#comment[1]"
// This line throws an XPathException
var reExtract = myNode.OwnerDocument.DocumentNode.SelectSingleNode(xpath);
异常消息:'/#comment[1]' has an invalid token.
我想知道,我从节点本身获取了XPath,这意味着它是一个合适的XPath,我将它用于同一个文档,为什么它会失败,我会错过什么?
更新
选择其他一些节点时,我会收到此异常:Expression must evaluate to a node-set.
(xpath
包含/html[1]/body[1]/div[1]/p[3]/strong[1]/#text[1]
)。
但请记住,该值取自节点本身,因此非常奇怪。怎么抱怨它无效?
答案 0 :(得分:2)
#字符在元素名称中是非法的。选择注释的有效XPath表达式为/comment()[1]
答案 1 :(得分:1)
根据Mak Toro的回答,我创建了一个变通办法功能:
private string ValidateXPath(string xpath)
{
var index = xpath.LastIndexOf("/");
var lastPath = xpath.Substring(index);
if (lastPath.Contains("#"))
{
xpath = xpath.Substring(0, index);
lastPath = lastPath.Replace("#", "");
lastPath = lastPath.Replace("[", "()[");
xpath = xpath + lastPath;
}
return xpath;
}
现在效果很好。