2011-11-25 48 views
23

Desidero sostituire il testo interno dei tag HTML con un altro testo. Sto usando HtmlAgilityPack
Io uso questo codice per estrarre tutti i testiHtmlAgilityPack imposta il nodo InnerText

HtmlDocument doc = new HtmlDocument(); 
doc.Load("some path") 

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[normalize-space(.) != '']")) { 
    // How to replace node.InnerText with some text ? 
} 

Ma InnerText è in sola lettura. Come posso sostituire i testi con un altro testo e salvarli in un file?

+0

testo interno di Element è una combinazione di tutti i bambini tag testo interno. Vuoi sostituire tutti i tag bambini con un nodo di testo? –

+0

@YuriyRozhovetskiy Voglio sostituire ogni testo di elemento con del testo, infatti, voglio tradurre un sito Web in un'altra lingua. Voglio estrarre tutto il testo da una pagina e poi tradurre, sostituire e salvare. – Shahin

+2

È strano che la documentazione XML dica che questa proprietà 'Ottiene o imposta il testo tra i tag di inizio e di fine dell'oggetto. Ma fornisce solo un metodo' get' ... – BrainSlugs83

risposta

19

Prova il codice qui sotto. Seleziona tutti i nodi senza figli e i nodi di script filtrati. Forse hai bisogno di aggiungere qualche filtro aggiuntivo. Oltre alla tua espressione XPath, questo cerca anche i nodi foglia e filtra il contenuto di testo dei tag <script>.

var nodes = doc.DocumentNode.SelectNodes("//body//text()[(normalize-space(.) != '') and not(parent::script) and not(*)]"); 
foreach (HtmlNode htmlNode in nodes) 
{ 
    htmlNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(htmlNode.InnerText + "_translated"), htmlNode); 
} 
+0

Molto bene, grazie. come posso sovrascrivere l'html tradotto nel file precedente? Caricamento nodi da file/ – Shahin

+0

Got It! Doc.save .. Grazie mille:] – Shahin

+0

Se possibile, descrivi semplicemente qual è la differenza tra il mio codice XPath e il tuo? – Shahin

10

Strano, ma ho scoperto che InnerHtml non è in sola lettura. E quando ho provato a impostarla come quella

aElement.InnerHtml = "sometext"; 

il valore di InnerText cambiato anche "sometext"

+1

Ma si corre la possibilità di cambiare anche i tag html – jnoreiga

+3

InnerHtml non è in lettura. InnerText è. La documentazione sembra errata in quanto InnerText non è di sola lettura. – liang

+0

Mentre 'InnerHtml' supporta get/set, in certe situazioni non sembra sempre che cambi il contenuto del documento. Se lo si imposta, e poi si guarda il 'OuterHtml' del documento, il contenuto non viene sempre modificato. – Memetican

Problemi correlati