Eccezione durante l'interrogazione di HTML per ID utilizzando HTML Agility Pack

html html-agility-pack parsing xpath

Domanda

Sto utilizzando il pacchetto HTML Agility per analizzare un file ASPX in Visual Studio.

Sto cercando un elemento con un attributo ID specificato.

Il codice che sto usando è:

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

Tuttavia, quando eseguo questo codice genera l'eccezione "Espressione deve valutare su un set di nodi".

Qualcuno può dirmi perché questo " deve " valutare un set di nodi? Perché non può semplicemente non restituire nodi (la riga successiva chiama tagsWithId.Count)? Sicuramente l'HtmlNodeCollection che viene restituito dal metodo SelectNodes può contenere 0 nodi?

Oppure l'errore è dovuto a un'espressione Xpath non valida? [L'ID selettore che sto testando con questo esiste sicuramente nel file come <div id = "thisId">.]

È anche possibile caricare un file ASPX direttamente da Visual Studio (sto costruendo un componente aggiuntivo) o questo conterrà errori XML e dovrò invece caricare il flusso HTML di output ( cioè senza la dichiarazione della pagina all'inizio del file, ecc .)?

Risposta accettata

Il problema è nell'argomento di SelectNodes() :

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

(dopo aver eseguito la sostituzione) non è un'espressione XPath sybtactically legale . Quindi il problema non è che l'espressione XPath "non restituisce nodi" - il problema è che è sintatticamente illegale.

Secondo le specifiche XPath W3C:

" // è l'abbreviazione di /descendant-or-self::node()/ "

Quindi quanto sopra è esteso a:

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

Si noti che l'ultimo passaggio di posizione non ha test del nodo e inizia con il predicato. Questo è illegale in base alle regole di sintassi di XPath.

Probabilmente vuoi :

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché