read parser parse manage leer java xml-parsing sax saxparser rss-reader

java - manage - sax parser stringbuilder solo devuelve una línea



parser parse java (2)

Esta pregunta ya tiene una respuesta aquí:

Intenté usar un objeto con nombre de StringBuilder, pero todavía no recibo todo el CDATA de la etiqueta de descripción. El xml se encuentra en Events-Ovations365:

Básicamente solo tiene el CDATA en una línea:

img es: http://www.ovations365.com/sites/ovations365.com/images/org/81/newtown_medium.jpg

alt = "Ocmulgee Heritage Trail cinta de corte">

package com.example.ovations_proj; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import android.util.Log; import com.example.ovations_proj.RssItem; public class RssParseHandler extends DefaultHandler { private List<RssItem> rssItems; // Used to reference item while parsing private RssItem currentItem; // Parsing title indicator private boolean parsingTitle; // Parsing link indicator private boolean parsingLink; private boolean parsingDes; StringBuilder obj; public RssParseHandler() { rssItems = new ArrayList<RssItem>(); } public List<RssItem> getItems() { return rssItems; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("Start Element :" + qName); if ("item".equals(qName)) { //item currentItem = new RssItem(); }else if ("description".equals(qName) ) { //description obj = new StringBuilder(); parsingDes = true; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("End Element :" + qName); if ("item".equals(qName)) { rssItems.add(currentItem);//item currentItem = null; } else if ("description".equals(qName)) { //description String theFullText = obj.toString(); System.out.println("fulltext data: " + theFullText); parsingDes = false; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if (parsingTitle) { if (currentItem != null){ currentItem.setTitle(new String(ch, start, length)); } } else if (parsingDes) { if (currentItem != null && obj!=null ) { obj.append(ch, start, length); parsingDes = false; } } } }


Esto es lo que funcionó para mí con el código desordenándolo. Mi bandera parsingDes estaba causando solo un apéndice.

@Override public void characters(char[] ch, int start, int length) throws SAXException { if (parsingTitle) { if (currentItem != null){ currentItem.setTitle(new String(ch, start, length)); } } else if (parsingLink) { if (currentItem != null) { currentItem.setLink(new String(ch, start, length)); parsingLink = false; } } else if (parsingDes) { if (currentItem != null){// && obj!=null ) { obj.append(ch, start, length); //parsingDes = false; } }


Probablemente sea porque no está implementando correctamente el método de caracteres, consulte el tutorial de Oracle :

Los analizadores no están obligados a devolver ningún número particular de caracteres a la vez. Un analizador puede devolver cualquier cosa, desde un único carácter a la vez hasta varios miles, y seguir siendo una implementación conforme al estándar. Por lo tanto, si su aplicación necesita procesar los caracteres que ve, es aconsejable que el método de caracteres () acumule los caracteres en java.lang.StringBuffer y opere solo cuando esté seguro de que se han encontrado todos.

Tu código supone que obtienes todo el texto de un elemento en una llamada, pero eso no está garantizado. El método de caracteres necesita acumular el texto encontrado en un StringBuffer (o StringBuilder u otra estructura de datos), pero las decisiones sobre qué hacer con el texto acumulado deben estar en otro lugar, como en el método endElement . Parece que está configurando una bandera prematuramente en el método de caracteres y haciendo que se pierda el resto del texto.