-->

Java的SAX解析器仅返回标签的一行(Java Sax Parser only returning

2019-10-17 22:42发布

我试图解析的XML描述标签,但只输出一行:

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

也就是说只有在CDATA文本的一小部分,我想输出多个项目的描述。 为什么我不能得到整个CDATA?

XML是位于: 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;
            }
        }
    }
}

Answer 1:

它似乎在字符数据<![CDATA[...]]>部分被以多个数据块,即在多次调用发送characters方法。

该对的ContentHandler文档characters方法提到SAX解析器可以自由地做到这一点:

SAX解析器可返回所有连续的字符数据中的单个块,或者它们可以将其分割成几个存储块[....]

因此,你需要调整你的characters的方法来处理被称为多次的连续字符相同的数据块。



文章来源: Java Sax Parser only returning one line of a tag