2013-09-16 6 views
1

Мне нужно поймать данные из < itunes: sumary>, но мой обработчик получает только конец содержимого тега (например, последние три слова). Я не знаю, что делать, потому что другие теги обрабатываются так, как ожидалось, получая все содержимое. *SAX получает только конец строки содержимого

Я видел, что некоторые теги игнорируются парсером, но я не думаю, что это происходит потому, что, поскольку я сказал, что получает контент, но только в конце этого.

Источник XML размещается в ->http://djpaulonla.podomatic.com/archive/rss2.xml

Пожалуйста, может кто-то помочь мне ??? Код следующее:

public class PodOMaticCustomHandler extends CustomHandler { 

public PodOMaticCustomHandler(int quantityToFetch, String startTagValue, 
     String endTagValue) { 
    super(quantityToFetch, startTagValue, endTagValue); 
} 

@Override 
public void characters(char[] ch, int start, int length) 
     throws SAXException { 
    super.characters(ch, start, length); 
    this.value = new String(ch, start, length); 
} 

@Override 
public void endDocument() throws SAXException { 
    super.endDocument(); 
    this.endDoc = true; 
} 

@Override 
public void endElement(String uri, String localName, String qName) 
     throws SAXException { 
    super.endElement(uri, localName, qName); 

    if (this.podcast != null) { 
     if (qName.equalsIgnoreCase("title")) { 
      podcast.setTitle(this.value); 
     } else if (qName.equalsIgnoreCase("pubDate")) { 
      podcast.setPubDate(this.value); 
     } else if (qName.equalsIgnoreCase("description")) { 
      podcast.setContent(this.value); 
     } else if (qName.equalsIgnoreCase("guid")) { 
      this.podcast.setLink(value); 
     } 
    } 

} 

@Override 
public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException { 
    super.startElement(uri, localName, qName, attributes); 

    if (this.startTagValue == null) { 
     this.startTagValueFound = true; 
    } else if (qName.equalsIgnoreCase("guid") 
      && this.value.equalsIgnoreCase(this.startTagValue)) { 
     this.startTagValueFound = true; 
    } 
    if (this.endTagValue != null) { 
     if (qName.equalsIgnoreCase("guid") 
       && this.value.equalsIgnoreCase(this.endTagValue)) { 
      this.endDoc = true; 
     } 
    } 
    if (!this.endDoc) { 
     if (this.quantityToFetch != this.podcasts.size()) { 
      if (this.startTagValueFound == true) { 
       if (qName.equalsIgnoreCase("item")) { 
        this.podcast = new Podcast(); 
       } else if (qName.equalsIgnoreCase("enclosure")) { 
        this.podcast.setMedia(attributes.getValue("url")); 
        this.podcasts.add(podcast); 
       } 
      } 
     } else { 
      this.podcast = null; 
     } 
    }else{ 
     this.podcast = null; 
     } 
    } 
    } 
+0

то, что вы столкнулись, является очень распространенным камнем преткновения с SAX, вам нужно реализовать метод символов по-разному. См. Ответы на вопрос, связанный в моем закрытом голосовании, для объяснения и примеров. –

+0

Возможный дубликат [Sax parsing and encoding] (http://stackoverflow.com/questions/1890404/sax-parsing-and-encoding) – ewernli

+0

Thanks = D Действительно полезный – Laniaventia

ответ

1

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

Добавить инструкцию журнала отладки в метод символов, показывающий, к чему вы устанавливаете значение, и вы увидите, что значения устанавливаются с первой частью строки, а затем перезаписываются последней частью.

Ответ заключается в том, чтобы буферизовать текст, переданный из вызовов символов в CharArrayWriter или StringBuilder. Затем вам нужно очистить буфер, когда будет найден конец элемента.

Вот что the Java tutorial on SAX должен сказать о методе символов:

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

+0

Спасибо, человек. Это было действительно полезно, и все работало так, как я хотел :) – Laniaventia