Html Agility Pack返回无效的XPath

时间:2011-07-06 04:04:11

标签: .net xpath html-agility-pack

我在两个窗口中打开了一个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])。

但请记住,该值取自节点本身,因此非常奇怪。怎么抱怨它无效?

2 个答案:

答案 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;
}

现在效果很好。