Ausnahme beim Abfragen von HTML für ID mit HTML Agility Pack

html html-agility-pack parsing xpath

Frage

Ich verwende das HTML Agility-Paket, um eine ASPX-Datei in Visual Studio zu analysieren.

Ich suche nach einem Element mit einem angegebenen ID-Attribut.

Der Code, den ich verwende, ist:

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

Wenn ich diesen Code ausführe, wird jedoch die Ausnahme "Ausdruck muss zu einem Knotensatz ausgewertet werden" ausgelöst.

Kann mir jemand sagen, warum das " muss " zu einem Knotensatz auswerten? Warum kann es nicht einfach keine Knoten zurückgeben (die nächste Zeile ruft tagsWithId.Count auf)? Sicherlich kann die HtmlNodeCollection, die von der SelectNodes-Methode zurückgegeben wird, 0 Knoten enthalten?

Oder liegt der Fehler an einem fehlerhaften Xpath-Ausdruck? [Die Selektor-ID, mit der ich dies teste, existiert definitiv in der Datei als <div id = "thisId">.]

Ist es sogar möglich, eine ASPX-Datei direkt aus Visual Studio zu laden (ich baue ein Add-In) oder enthält diese XML-Fehler und muss ich stattdessen den HTML-Ausgabestrom laden ( dh ohne die Seitendeklaration am Anfang) der Datei usw. )?

Akzeptierte Antwort

Das Problem liegt im Argument von SelectNodes() :

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

(nach Durchführung der Ersetzung) ist kein sybaktisch rechtlicher XPath-Ausdruck . Das Problem ist also nicht, dass die XPath-Expression "keine Knoten zurückgibt" - das Problem ist, dass es syntaktisch illegal ist.

Gemäß der XPath W3C Spezifikation:

" // ist kurz für /descendant-or-self::node()/ "

So wird das Obige erweitert auf:

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

Beachten Sie, dass der letzte Lokationsschritt keinen Nodetest hat und mit dem Prädikat beginnt. Dies ist gemäß den Syntaxregeln von XPath nicht zulässig.

Wahrscheinlich willst du :

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



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum