Seleziona HTML dalla posizione specifica usando Html Agility Pack

c# html html-agility-pack xpath

Domanda

Ho bisogno di ottenere nodi di testo html da, diciamo, riga 64, posizione riga 45, riga 183, posizione riga 22. Sono abbastanza nuovo per XPath e non sono abbastanza sicuro di quali siano le mie opzioni. Come dovrei procedere? Avevo in mente qualcosa del genere:

var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");

Risposta accettata

La classe HtmlNode ha due attributi importanti (per ciò che devi fare):

  • Line (la linea in cui inizia il nodo)
  • LinePosition (la linea in cui termina il nodo)

Potresti fare qualcosa come:

var nodes = doc.DocumentNode.Descendants("#text").Where(
    x => (x.Line > 64 || (x.Line == 64 && x.LinePosition >= 45)) &&
         (x.Line < 183 || (x.Line == 183 && x.LinePosition <= 22))
);

naturalmente, puoi anche fare doc.DocumentNode.SelectNodes("//text()").Where(...)

Un problema che dovrai affrontare:

Non ti dice dove finisce il nodo, quindi la soluzione sopra potrebbe darti nodi che finiscono in una linea più grande di 183 , o nella riga 183 ma in una posizione più grande di 22 . Per fare ciò, è possibile utilizzare la proprietà OuterHtml del nodo ed eseguire alcune manipolazioni delle stringhe (ottenere la lunghezza per sapere dove finisce, dividere \n per sapere quante linee, ecc.).


Risposta popolare

Non puoi farlo con XPath: non sa nulla dei numeri di linea e delle posizioni dei caratteri all'interno dell'XML.

La funzione position() restituisce la posizione relativa di un nodo in un elenco di nodi, ad esempio restituisce 1 per il primo nodo nell'elenco, 2 per il secondo e così via.

Per ottenere informazioni sulla posizione della linea, è possibile analizzare XML utilizzando XElement o XmlReader e quindi utilizzare l'interfaccia IXmlLineInfo .

Si noti, tuttavia, che l'utilizzo di posizioni di linea / carattere per identificare i frammenti di un file XML è problematico: i processori XML di routine riformattano di routine l'XML, aggiungendo / rimuovendo spazi e linee finali, e quindi lo stesso frammento XML può cambiare posizione.




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é