在 XOM 中解析 XHTML 文档时出现 DTD 下载错误
Posted
技术标签:
【中文标题】在 XOM 中解析 XHTML 文档时出现 DTD 下载错误【英文标题】:DTD download error while parsing XHTML document in XOM 【发布时间】:2010-11-03 03:40:36 【问题描述】:我正在尝试使用声明为使用的 doctype 解析 html 文档 过渡dtd如下:
渡//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
当我对文档执行 Builder.build 时,出现以下异常:
java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1305)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source)
at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at nu.xom.Builder.build(Builder.java:1127)
at nu.xom.Builder.build(Builder.java:1019)
如果我删除文档类型声明,它解析就好了。我能 从我的浏览器成功下载了 dtd,它告诉我 网址有效。我不想删除文档类型声明。是 有一种方法可以告诉构建器不要下载或提供 dtd 使用备用 dtd?
【问题讨论】:
您是从“野”中解析 html 还是您创建/控制了正在解析的页面? 我可以控制我正在解析的 html,所以至少我可以删除 doctype 声明。但我正在努力坚持良好做法并保留 doctype 声明。 【参考方案1】:这样就解决了问题:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Document document = factory.newDocumentBuilder().parse(is);
【讨论】:
【参考方案2】:快速查看Builder 的javadoc,我想您可以通过采用XMLReader 的构造函数提供EntityResolver。我会尽可能避免让解析器从 Internet 下载文件。
【讨论】:
org.apache.xerces.parsers.SAXParser xmlReader = new SAXParser(); xmlReader.setFeature("apache.org/xml/features/nonvalidating/load-external-dtd", false);生成器 xomBuilder = new Builder(xmlReader); 为什么会发生 503:w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic 我没有禁用 DTD,而是下载了它,并将其作为嵌入式资源添加到我的软件中;所以,然后,当解析器需要它时,我给它我本地/下载/缓存的 DTD 副本,而不是从互联网上获取它。我认为这比完全禁用 DTD 处理要好。以上是关于在 XOM 中解析 XHTML 文档时出现 DTD 下载错误的主要内容,如果未能解决你的问题,请参考以下文章
在 Facelets 中使用 JavaScript 时出现 XHTML 解析错误 [重复]
为啥在 MS SQL Server 中批量插入时出现“XML 解析:第 2 行,字符 0,文档语法不正确”