2011-07-06 50 views
2

我在兩個窗口中打開了一個HTML文檔,我需要在兩個窗口之間同步所選節點。Html Agility Pack返回無效的XPath

使用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

#字符在元素名稱中是非法的。即選擇註釋有效的XPath表達式將/comment()[1]

+0

那麼HtmlNode.XPath屬性怎麼返回呢?有沒有辦法將HtmlNode.XPath轉換爲有效的XPath? – Shimmy

+0

@Shimmy:你得問問這個庫的開發者。 –

+0

任何解決方法? – Shimmy

1

根據麥託羅的答案我創建了一個解決辦法功能:

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

現在,它的偉大工程。

+0

我知道這是一箇舊帖子,但我會建議使用'xpath.Replace(「#comment」,「comment()」);'看起來好像有很多事情可能會出現問題。 – JLRishe