如何修复特性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
相关产品推荐
相关产品推荐

