|
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
|
Herramientas |
#1
|
||||
|
||||
Detectar saltos de linea en JSoup
Estoy parseando datos de un rss con jsoup que muestro en un activity, funciona bien, lo que pasa es que los párrafos me los muestra juntos, no separados por un salto de linea y un espacio, si no como un bloque entero de texto, sabéis como detectar en un String el punto y el espacio o salto de linea y añadir una linea vacia para separar el texto? Con "replace(...etc)" quizas?
__________________
|
|
#2
|
||||
|
||||
Preguntas:
- ¿Puedes poner un ejemplo del código HTML del RSS? ¿Y cómo es la String resultante? - ¿Qué es lo que extrae JSoup, el HTML o texto sin formato? - ¿Dónde lo muestras? ¿En un TextView, en un WebView? Con String replaceAll claro que puedes reemplazar cosas con expresiones regulares, pero si los saltos de línea los ha fusilado JSoup habrá que configurar JSoup en vez de "adivinar" dónde están los saltos. Si quieres texto simple sin formato con saltos de línea lo más seguro es que tengas que configurar el parseo de JSoup como indican en este tutorial https://www.javacodeexamples.com/jso...es-example/799 , es decir, añadir después de los br y p una nueva línea y luego ya limpiar el html de etiquetas pero conservando los saltos de línea. Eso suponiendo que quieras texto simple respetando los saltos. Sin embargo, otra opción es conservar los p y los br y mostrar HTML en los TextView o WebView o lo que uses. Con JSoup podrías eliminar los enlaces o etiquetas de formato que no quieras (para eso está la whitelist del método clean). Pero igual te interesa conservar las negritas, cursivas, etc. Eso ya depende de lo que estés haciendo y si te importa el formato o no.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Última edición por mocelet Día 09/07/18 a las 11:19:20. |
#3
|
||||
|
||||
1- es un Rss de noticias de internet, els String es texto 2- Estrae las etiquetas <title>,<description>...etc 3- en un TextView, uno para el titulo y otro para la descripcion. La descripcion me muestra el texto sin las etiquetas <![CDATA], o sea, solo el texto simple a secas, muestra los saltos de linea pero muy juntos, quiero meter una linea en blanco.
__________________
|
#4
|
||||
|
||||
Vale, ¿y cómo es una String de la descripción con saltos de línea? En otras palabras, ¿el salto de línea cómo aparece en la String? ¿En HTML con un <br/>, como un carácter de nueva línea \n?
Cuando dices que te muestra los saltos de línea pero muy juntos, ¿qué quieres decir? ¿Que entonces sí que te muestra los saltos de línea? (antes decías que el problema era que te salía el texto seguido) Por eso te pedía un ejemplo de qué String tienes, qué ves ahora y qué esperas ver XD
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
Gracias de parte de: | ||
#5
|
||||
|
||||
No tiene <br/>, cada parrafo esta con etiquetas <p></p>, un ejemplo:
Como se ve ahora: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse congue aliquet lorem, non accumsan est aliquam sed. Vivamus et turpis viverra, porta velit eget, euismod urna. Ut varius a est at condimentum. Sed pulvinar sed tellus vel facilisis. <--- fin </p>, SALTO DE LINEA y texto seguido Proin ut condimentum mi, eget consectetur nisi. Proin pulvinar, sem sit amet dictum pharetra, nisl purus aliquam purus, a hendrerit massa odio a ligula. Suspendisse ac tortor lacinia lacus suscipit semper. Como deberia verse: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse congue aliquet lorem, non accumsan est aliquam sed. Vivamus et turpis viverra, porta velit eget, euismod urna. Ut varius a est at condimentum. Sed pulvinar sed tellus vel facilisis. <--- SALTO DE LINEA + ESPACIO Proin ut condimentum mi, eget consectetur nisi. Proin pulvinar, sem sit amet dictum pharetra, nisl purus aliquam purus, a hendrerit massa odio a ligula. Suspendisse ac tortor lacinia lacus suscipit semper. el texto se muestra correctamente, es mas cuestion de estetica para no ver todo el articulo como un solo parrafo.
__________________
|
#6
|
||||
|
||||
OK, entonces la String que pones en el TextView no es texto sino HTML con sus etiquetas. Imagino entonces que tienes algo tal que así y llamas al fromHtml porque, si no, verías las etiquetas en el text view:
Código:
textView.setText(Html.fromHtml("<p>L1</p><p>L2</p>")); EDIT: Si el String que te da JSoup NO tiene las etiquetas <p> porque ya ha limpiado el HTML y ha metido un retorno de carro nada más, entonces tienes que hacer lo del tutorial que te decía en mi primera respuesta, que es meter a mano un retorno de carro extra después de los </p>.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Última edición por mocelet Día 10/07/18 a las 11:16:47. |
#7
|
||||
|
||||
Exacto, limpio el html porque si no me muestra toda la perefernalia de etiquetas mezcladas con el texto, con esta clase.
Código:
String removeCdata(String data) { data = data.replace("<![CDATA[", ""); data = data.replace("]]>", ""); return data; } Código:
String descripcion = removeCdata(item.select("content|encoded").text()); Código:
<content:encoded><![CDATA[<p>Aqui el texto o parrafo...etc</p> <p>Aqui otro parrafo, bla bla</p> <p>y asi unos cuantos parrafos...etc</p>]]></content:encoded>
__________________
|
#8
|
||||
|
||||
Entiendo, la opción chapucilla es hacer un replace de /n por /n/n o seguir el tutorial que enlacé para añadir un /n extra.
Pero yo creo que es mejor que al TextView le pases HTML con la función fromHtml como en el ejemplo que te ponía. Aprovechando eso sí que JSoup tiene un método clean y su whitelist para dejar el HTML solo con las etiquetas que te importan (p, br, alguna etiqueta de formato si quieres negritas y cursivas y poco más).
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Última edición por mocelet Día 10/07/18 a las 13:13:47. |
Gracias de parte de: | ||
#9
|
||||
|
||||
Gracias mocelet, mirare el tutorial que pusiste asi como los metodos de JSoup a ver que tal...
__________________
|
#10
|
||||
|
||||
He cogido tu ejemplo para hacer una prueba. Aunque está en Kotlin no te costará nada escribirlo en Java Código:
val rssText = "<content:encoded><![CDATA[<p>Aqui el <b>texto</b> o parrafo...etc</p><p>Aqui otro parrafo, bla bla</p><p>y asi unos cuantos parrafos...etc</p>]]></content:encoded>" val item = Jsoup.parse(rssText) val rawDescriptionHtml = removeCdata(item.select("content|encoded").html()) val whitelist = Whitelist.simpleText().addTags("p", "br") val cleanDescriptionHtml = Jsoup.clean(rawDescriptionHtml, whitelist) textView.setText(Html.fromHtml(cleanDescriptionHtml)) Hay varios tipos de whitelist, si el formato negrita, cursiva, etc. tampoco lo quieres en vez de simpleText() usa none(). El addTags es necesario para especificar qué etiquetas quieres que te conserve, en este caso p y br que son las únicas que marcan párrafos. Con el html limpito lo presentamos en el textView y ya está, no hay que añadir retornos de carro ni hacer chapucillas.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Última edición por mocelet Día 10/07/18 a las 14:11:53. |
Gracias de parte de: | ||
#11
|
||||
|
||||
Genial... , eso es exactamente lo que buscaba
__________________
|
#12
|
||||
|
||||
Y ya para aprovechar el post, como puedo formatear la fecha obtenida de las etiquetas "<pubDate>"?.
asi la obtengo: Código:
String fecha = item.select("pubDate").text(); --- Nada, ya lo he solucionado
__________________
Última edición por kaiser75 Día 11/07/18 a las 13:06:27. Razón: Ya solucionado. |
#13
|
||||
|
||||
El formato de pubDate está especificado en la RFC-822, en la mayoría de los casos te valdrá un SimpleDateFormat con el patrón adecuado para convertirlo a Date. Una vez tengas el Date, con otro formateador obtienes el resultado final que quieras presentar.
Algo así, no estoy tratando los errores ni contemplando casos poco habituales pero posibles como que no salga el día o no salgan los segundos: Código:
val pubDateRfc822 = "Wed, 11 Jul 2018 12:15:23 +0200" val rfc822Format = SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.US); val pubDate = rfc822Format.parse(pubDateRfc822) val targetFormat = SimpleDateFormat("EEE d MMMM HH:mm") // mié. 11 julio 12:15 val result = targetFormat.format(pubDate) El segundo SimpleDateFormat es ya para formatear la fecha como te apetezca, ahí te he puesto el del ejemplo que querías pero puedes jugar con los patrones que vienen explicados en la documentación de SimpleDateFormat. Al no poner Locale lo hará en el idioma del dispositivo. EDIT: No había leído lo de que ya estaba solucionado, imagino que has usado el SimpleDateFormat igualmente. Ten en cuenta que hay formas de parsear la fecha que pierden la información de la zona horaria y entonces no va a poner la fecha bien. Lo ideal sería usar una biblioteca o una función que esté probada con todos los casos y sea robusta. Tampoco hace falta reinventar la rueda.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Última edición por mocelet Día 11/07/18 a las 13:45:50. |
Estás aquí | ||||||
|