简体   繁体   中英

Java Sax Parser only returning one line of a tag

I am trying to parse the description tag in the xml but it only outputs one line:

description: <img src=http://www.ovations365.com/sites/ovations365.com/images/event/441705771/sparkswebsite_medium.jpg alt="SPARKS: Understanding Energy">

That is only a small part of the text in the CDATA and I'm trying to output the description for multiple items. Why can't I get the whole CDATA?

The XML is located: http://feeds.feedburner.com/Events-Ovations365

package com.example.ovations_proj;

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


    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 ("title".equals(qName)) { //title
            parsingTitle = true;
        } else if ("link".equals(qName)) { //link
            parsingLink = true;
        }else if ("description".equals(qName) ) { //description
            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 ("title".equals(qName)) {//title
            parsingTitle = false;
        } else if ("link".equals(qName)) {//link
            parsingLink = false;
        } else if ("description".equals(qName) ) {  //description

            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 (parsingLink) { 
            if (currentItem != null) {
                currentItem.setLink(new String(ch, start, length));
                parsingLink = false;
            }
        } else if (parsingDes) {       
            if (currentItem != null) {                      
                currentItem.setDes(new String(ch, start, length));
                System.out.println("description:  "  + currentItem.getDes());
                parsingDes = false;
            }
        }
    }
}

It seems that the character data in the <![CDATA[...]]> sections is being sent in multiple chunks, ie in multiple calls to the characters method.

The ContentHandler documentation for the characters method mentions that SAX parsers are free to do this:

SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks[....]

You'll therefore need to adjust your characters method to handle being called multiple times for the same chunk of contiguous character data.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM