You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复特性http://apache.org/xml/features/disallow-doctype-decl设为true时DOCTYPE被禁用的问题?

解决Rome解析Feed时的DOCTYPE禁用错误

问题描述

使用Rome工具解析Feed时,部分Feed触发以下错误:

[Test worker] ERROR com.rss.rome.RomeClient - feed url https://razzball.com/feed/ failed Invalid XML: Error on line 1: DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true.

对应示例代码:

import com.rometools.rome.feed.synd.SyndEntry;
import com.rometools.rome.feed.synd.SyndFeed;
import com.rometools.rome.feed.synd.SyndImage;
import com.rometools.rome.io.SyndFeedInput;
import com.rometools.rome.io.XmlReader;
 
@Override
public List<?> handleResponse(ClassicHttpResponse response) throws IOException {
    List<Article> articles = new ArrayList<>();

    try {
        SyndFeedInput input = new SyndFeedInput();
        SyndFeed feed = input.build(new XmlReader(response.getEntity().getContent()));
        List<SyndEntry> recentEntries = filterRecentEntries(feed);
        // ... 后续逻辑
    } catch (Exception e) {
        // 异常处理
    }
    return articles;
}

解决方案

错误源于Rome默认依赖的Apache XML解析器开启了disallow-doctype-decl特性,禁止解析含DOCTYPE声明的XML文档。只需手动配置XMLReader,关闭该特性即可:

修改后的代码:

import com.rometools.rome.feed.synd.SyndEntry;
import com.rometools.rome.feed.synd.SyndFeed;
import com.rometools.rome.io.SyndFeedInput;
import com.rometools.rome.io.XmlReader;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

@Override
public List<?> handleResponse(ClassicHttpResponse response) throws IOException {
    List<Article> articles = new ArrayList<>();

    try {
        SyndFeedInput input = new SyndFeedInput();
        // 创建XMLReader并关闭禁用DOCTYPE的特性
        XMLReader xmlReader = XMLReaderFactory.createXMLReader();
        xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false);
        // 构建输入源
        InputSource inputSource = new InputSource(response.getEntity().getContent());
        // 使用配置好的XMLReader解析Feed
        SyndFeed feed = input.build(new XmlReader(xmlReader, inputSource));
        List<SyndEntry> recentEntries = filterRecentEntries(feed);
        // ... 后续处理逻辑
    } catch (Exception e) {
        // 异常处理
        e.printStackTrace();
    }
    return articles;
}

内容的提问来源于stack exchange,提问作者selvi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:42:32