sax解析器stringbuilder只返回一行

时间:2013-04-02 04:18:40

标签: java xml-parsing sax saxparser rss-reader

我尝试过使用StringBuilder命名对象,但我仍然没有从描述标记中获取所有CDATA。xml位于 at Events-Ovations365:

基本上它只能将CDATA放在一行:

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

alt =“Ocmulgee Heritage Trail Ribbon Cutting”>

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

2 个答案:

答案 0 :(得分:3)

可能是因为您没有正确实现字符方法,请参阅Oracle's tutorial

  

解析器不需要返回任何特定数量的字符   在一次。解析器可以从a处的单个字符返回任何内容   时间长达数千,仍然是符合标准的   实现。因此,如果您的应用程序需要处理字符   它看到,使用characters()方法累积它是明智的   java.lang.StringBuffer中的字符,仅在以下情况下对它们进行操作   你确定已找到所有这些。

您的代码假设您在一次调用中获取了元素的整个文本,但这并不能保证。 characters方法需要将找到的文本累积到StringBuffer(或StringBuilder或其他数据结构)中,但是关于如何处理累积文本的决定需要在其他地方,例如在{{1}中} 方法。看起来你在characters方法中过早地设置了一个标志,导致文本的其余部分丢失。

答案 1 :(得分: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;
        }
    }