3

HTML Agilityパックを使用して、VisualStudio内のASPXファイルを解析しています。

指定されたID属性を持つ要素を検索しています。

私が使用しているコードは次のとおりです。

var html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml(docText);
if (html.DocumentNode != null)
{
     try
     {
          var tagsWithId = html.DocumentNode.SelectNodes(string.Format("//[@id='{0}']", selector.Id));

ただし、このコードを実行すると、「式はノードセットに評価される必要があります」という例外がスローされます。

なぜこれがノードセットに「評価されなければならない」のか誰かに教えてもらえますか?単純にノードを返さないのはなぜですか(次の行はtagsWithId.Countを呼び出します)?確かに、SelectNodesメソッドによって返されるHtmlNodeCollectionには0ノードを含めることができますか?

または、Xpath式の形式が正しくないためにエラーが発生しますか?[これをテストしているセレクターIDは、ファイルに<div id="thisId">として確実に存在します。]

Visual Studioから直接ASPXファイルをロードすることも可能ですか(アドインを構築しています)、またはこれにXMLエラーが含まれ、代わりに出力HTMLストリームをロードする必要があります(つまり、最初にページ宣言なしで)ファイルのなど)?

4

1 に答える 1

5

問題は次の議論にありますSelectNodes()

//[@id='{0}']

(置換を実行した後)は、構文的に正当なXPath式ではありません。したがって、問題はXPath式が「ノードを返さない」ということではありません。問題は構文的に違法であるということです。

XPath W3C仕様によると:

「は」//の略です/descendant-or-self::node()/

したがって、上記は次のように拡張されます。

/descendant-or-self::node()/[@id='{0}']

最後のロケーションステップにはノードテストがなく、述語で始まることに注意してください。XPathの構文規則によれば、これは違法です。

おそらくあなたが欲しい

//*[@id='{0}']
于 2010-07-04T15:29:43.917 に答える