【问题标题】:RSS Reader using Sax Parser losing characters from title使用 Sax Parser 的 RSS 阅读器从标题中丢失字符
【发布时间】:2015-08-28 22:39:16
【问题描述】:

我正在尝试使用 SAX 解析器从 URL - http://pitchfork.com/rss/news/ 返回 RSS 提要的内容,但在显示标题、显示部分文本或仅显示结束标记时经常会丢失字符 "> "

如何修改我的处理程序类以防止这种情况发生?我想我可能应该使用 StringBuilder 或 StringBuffer,但我不确定如何实现它。

ParseHandler.java

public class RssParseHandler extends DefaultHandler {
//Parsed items
private List<RssItem> rssItems;
private RssItem currentItem;
private boolean parsingTitle;
private boolean parsingLink;
private boolean parsing_id;
private boolean parsingDescription;

public RssParseHandler() {
    rssItems = new ArrayList<RssItem>();
}

public List<RssItem> getItems() {
    return rssItems;
}

//Creates empty RssItem object during the process of an item start tag
//Indicators are set to true when particular tag is being processed
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

    if ("item".equals(qName)) {
        currentItem = new RssItem();

    } else if ("title".equals(qName)) {
        parsingTitle = true;


    } else if ("link".equals(qName)) {
        parsingLink = true;


    } else if ("_id".equals(qName)) {
        parsing_id = true;


    } else if ("description".equals(qName)) {
        parsingDescription = true;

    }
}

//Current RssItem is added to the list following process of end tag
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

    if ("item".equals(qName)) {
        rssItems.add(currentItem);
        currentItem = null;

    } else if ("title".equals(qName)) {
        parsingTitle = false;

    } else if ("link".equals(qName)) {
        parsingLink = false;

    } else if ("_id".equals(qName)) {
        parsing_id = false;

    } else if ("description".equals(qName)) {
        parsingDescription = 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 (parsing_id) {
        if (currentItem != null) {
            currentItem.set_id(new String(ch, start, length));
            parsing_id = false;
        }

    } else if (parsingDescription) {
        if (currentItem != null) {
            currentItem.setDescription(new String(ch, start, length));
            parsingDescription = false;
        }

    }
}}//rssHandlerClass

【问题讨论】:

    标签: java android xml saxparser rss-reader


    【解决方案1】:

    使用 StringBuilder 来构建标签,而不是像文档中所说的那样使用新的 String 实例:

    解析器将调用此方法来报告每个字符数据块。 SAX 解析器可以在单个块中返回所有连续的字符数据,也可以将其拆分为多个块;但是,任何单个事件中的所有角色都必须来自同一个外部实体,以便定位器提供有用的信息。

    而@CommonWares 在他的帖子Here. 中正是这么说的

    使用 StringBuilder 构建您的标签,因为它是一次进入的块而不是整个字符串(这解释了不完整的标签!)。你可能需要也可能不需要 isBuilding 标志,但我不知道你的整个实现,所以我添加了它。

       StringBuilder mSb;
       boolean isBuilding;
    
       @Override
       public void startElement(String uri, String localName, String qName,
             Attributes attributes) throws SAXException {
    
            mSb = new StringBuilder();
            isBuilding = true;
    
            if(qName.equals("title")){
                parsingTitle = true;
            }
            ...
            ...
        }
    
        @Override
        public void characters (char ch[], int start, int length) {
            if (mSb !=null && isBuilding) {
                for (int i=start; i<start+length; i++) {
                    mSb.append(ch[i]);
                }
            }
        }
    
        @Override
        public void endElement(String uri, String localName, String qName)
            throws SAXException {
    
            if(parsingTitle){
                currentItem.setTitle(sb.toString().trim());
                parsingTitle = false;  
                isBuilding = false;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 2021-12-05
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多