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.