Html Agility Pack возвращает недопустимый XPath - PullRequest
2 голосов
/ 06 июля 2011

У меня есть документ 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 ]

2 голосов
/ 06 июля 2011

Символ # недопустим в имени элемента.Допустимое выражение XPath, которое выбирает комментарий, будет /comment()[1]

1 голос
/ 06 июля 2011

В соответствии с ответом Мак Торо я создал обходную функцию:

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

Теперь она отлично работает.

...