如何使用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

下一篇: SVG drop shadow using css3