我尝试过使用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;
}
}
}
}
答案 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;
}
}