2011-07-06 19 views
2

私はHTML文書を2つのウィンドウで開き、選択したノードを両方のウィンドウ間で同期させる必要があります。Html Agility Packが無効なXPathを返す

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を取って、私はに対してそれを使用し、私が試したHtml Agility Packを使用し

同じ文書、それはなぜ失敗するのですか、私は何を欠場するのですか?

更新

私が代わりにこの例外を取得するいくつかの他のノードを選択: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

関連する問題