2013-04-02 4 views
1

Я попытался с помощью StringBuilder имени объекта, но я до сих пор не получаю все CDATA из описания tag.The XML находится at Events-Ovations365:саксофон анализатор StringBuilder возвращает только одну строку

В основном он получает только CDATA на одной строке:

IMG является: http://www.ovations365.com/sites/ovations365.com/images/org/81/newtown_medium.jpg

альт = "Ocmulgee Heritage Trail перерезана лента">

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; 
      } 
     } 
    } 
} 

ответ

3

Это, вероятно, потому, что вы не реализует метод символов правильно, см Oracle's tutorial:

парсеры не обязаны возвращать любое определенное количество символов в одно время. Парсер может вернуть что-либо из одного символа в времени до нескольких тысяч и по-прежнему будет соответствовать стандарту . Поэтому, если ваше приложение должно обрабатывать символы , он видит, что разумно, чтобы метод characters() накапливал символы в java.lang.StringBuffer и работал на них только тогда, когда вы уверены, что все они были найденный.

Ваш код предполагает, что вы получаете весь текст для элемента за один звонок, но это не гарантируется. Метод символов должен накапливать текст, найденный в StringBuffer (или StringBuilder или другую структуру данных), но решения о том, что делать с накопленным текстом, должны быть где-то в другом месте, например, в методе endElement. Похоже, что вы устанавливаете флаг преждевременно в методе символов и заставляете остальную часть текста потерять.

+0

Я все еще немного смущен. Как я неправильно использую свой StringBuffer? – user2230114

+1

@ user2230114: символы могут быть вызваны несколько раз, вы можете получить первую часть строки в одном вызове и вторую часть строки в другом вызове. поэтому, если вы установите флаг на основе того, что получили что-то, вы можете потерять все остальное. Добавьте строку отладки, распечатав то, что вы получаете в методе символов. –

+0

Спасибо, Натан, который решил это. – user2230114

0

Вот что сработало для меня с кодом, который запустил его. Мой флаг parsingDes вызывал только одно добавление.

@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; 
     } 
    }