Java Sax Parser only returning one line of a tag

主宰稳场 提交于 2019-12-13 02:37:42

问题


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

回答1:


It seems that the character data in the <![CDATA[...]]> sections is being sent in multiple chunks, i.e. 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.



来源:https://stackoverflow.com/questions/15734418/java-sax-parser-only-returning-one-line-of-a-tag

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!