2010-04-14 67 views
4

我面臨使用DOM解析器解析xhtml和DOCTYPE聲明的問題。如何使用DOM解析器解析xhtml忽略DOCTYPE聲明

錯誤: 產生java.io.IOException:服務器返回的HTTP響應代碼:503網址: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd%20

聲明:DOCTYPE HTML PUBLIC 「 - // W3C // DTD XHTML 1.0過渡// EN」 「http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

有沒有一種方法來解析XHTML Document對象忽略DOCTYPE聲明。

回答

4

對我而言,一個解決方案是給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("")); 
      } 
     }); 
1

解析器是需要下載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"> 
+0

我使用了相同的DOCTYPE。將獨立屬性設置爲「是」時,它仍會給出相同的錯誤。下面是我的我的xhtml:<?xml version =「1.0」encoding =「UTF-8」standalone =「yes」?><!DOCTYPE html PUBLIC「 - // W3C // DTD XHTML 1.0 Transitional // EN「」http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd「> 我仍然得到相同的錯誤。 java.io.IOException:服務器返回的HTTP響應代碼:503 for URL:http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd%20 – Rachel 2010-04-14 20:56:04

+1

您在'.dtd'和''' – 2010-04-14 21:32:14

+1

這似乎是一個常見問題,正如博客中所討論的那樣,http://www.w3.org/2005/06/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic – Rachel 2010-04-15 01:20:42

1

最簡單的事情就是在DocumentBuilderFactory中設置validating = false。如果您想進行驗證,請下載DTD並使用本地副本。如上評論瑞秋,這是在The WWW Consortium.

總之討論,因爲默認的DocumentBuilderFactory下載DTD每次驗證時,W3被擊中每一個典型的程序員試圖解析Java中的XHTML文件的時間。他們買不起那麼多的流量,所以他們迴應時有一個錯誤。

0

取而代之的是假的解析器,下面的代碼片段指示解析器真的不理來自DOCTYPE聲明的外部DTD:

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 

(...) 

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); 
f.setValidating(false); 
f.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
DocumentBuilder builder = f.newDocumentBuilder(); 
Document document = builder.parse(...)