如何使用DOM解析器解析xhtml忽略DOCTYPE声明
我面临使用DOM解析器解析带有DOCTYPE声明的xhtml的问题。
错误:java.io.IOException:服务器返回HTTP响应代码:503:URL:http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd%20
声明:DOCTYPE html PUBLIC“ - // W3C // DTD XHTML 1.0 Transitional // EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
有没有办法将xhtml解析为Document对象而忽略DOCTYPE声明。
一个适用于我的解决方案是给DocumentBuilder一个假的Resolver,它返回一个空的流。 这里有一个很好的解释(查看kdgregory的最后一条消息)
http://forums.sun.com/thread.jspa?threadID=5362097
这里是kdgregory的解决方案:
documentBuilder.setEntityResolver(new EntityResolver()
{
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException
{
return new InputSource(new StringReader(""));
}
});
解析器需要下载DTD,但您可以通过在<?xml... ?>
行上设置独立属性来解决它。
但请注意,此特定错误很可能是由XML架构定义与DTD URL之间的混淆所引发的。 有关详细信息,请参阅http://www.w3schools.com/xhtml/xhtml_dtd.asp。 正确的是:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
最简单的方法是在DocumentBuilderFactory中设置validating = false。 如果您想进行验证,请下载DTD并使用本地副本。 正如上面Rachel评论的那样,WWW联盟对此进行了讨论。
简而言之,因为默认的DocumentBuilderFactory每次验证都会下载DTD,所以每当典型的程序员试图用Java解析XHTML文件时,W3就会受到攻击。 他们买不起那么多的流量,所以他们回应时有一个错误。
链接地址: http://www.djcxy.com/p/89045.html上一篇: How to parse a xhtml ignoring the DOCTYPE declaration using DOM parser