2011-11-25 30 views
23

Quiero reemplazar el texto interno de las etiquetas HTML con otro texto. estoy usando HtmlAgilityPack
que utiliza este código para extraer todos los textosHtmlAgilityPack set node 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 ? 
} 

Pero InnerText es de sólo lectura. ¿Cómo puedo reemplazar textos con otro texto y guardarlos en un archivo?

+0

texto interno del elemento es una combinación de todos los niños etiquetas de texto interno. ¿Desea reemplazar todas las etiquetas secundarias por un nodo de texto? –

+0

@YuriyRozhovetskiy Quiero reemplazar el texto de cada elemento con texto, de hecho, quiero traducir un sitio web a otro idioma. Quiero extraer todo el texto de una página, luego traducir, reemplazar y guardar. – Shahin

+2

Es extraño que la documentación XML diga que esta propiedad 'Obtiene o establece el texto entre las etiquetas de inicio y final del objeto', pero luego solo proporciona un método' get' ... – BrainSlugs83

Respuesta

19

Probar el código a continuación. Selecciona todos los nodos sin hijos y los nodos de script filtrados. Quizás necesite agregar algún filtro adicional. Además de su expresión XPath, esta también busca nodos hoja y filtra el contenido de texto de las etiquetas <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

Muy bien gracias. ¿Cómo puedo sobrescribir el html traducido al archivo anterior? Puedo cargar nodos del archivo/ – Shahin

+0

¡Lo tengo! Doc.save .. Muchas gracias:] – Shahin

+0

Si es posible, solo describa la diferencia entre mi código XPath y el suyo. – Shahin

10

Extraño, pero he encontrado que InnerHtml no es de solo lectura. Y cuando traté de ponerlo de esa manera

aElement.InnerHtml = "sometext"; 

el valor de InnerText también cambió a "sometext"

+1

Pero corre el riesgo de cambiar las etiquetas html también – jnoreiga

+3

InnerHtml no es de solo lectura. InnerText es. La documentación parece incorrecta acerca de que InnerText no es de solo lectura. – liang

+0

Si bien 'InnerHtml' admite get/set, en ciertas situaciones no siempre parece cambiar realmente el contenido del documento. Si lo configura y luego mira el 'OuterHtml' del documento, el contenido no siempre cambia. – Memetican