Java xerces暂停获取xhtml1过渡DTD

Java xerces暂停获取xhtml1过渡DTD,java,xml,dtd,Java,Xml,Dtd,我想在线对XML文档执行XPath查询。我已经设置了InputStreams,用于检索内容并附加一个头,该头声明HTTP请求的字符集字段中存在的编码。虽然它能工作,但速度非常慢 //bis is the BufferedInputStream with the content part of the HTTP reply docBuilder = docBuilderFactory.newDocumentBuilder(); // throws exception. Document d

我想在线对XML文档执行XPath查询。我已经设置了InputStreams,用于检索内容并附加一个
头,该头声明HTTP请求的
字符集
字段中存在的编码。虽然它能工作,但速度非常慢

    //bis is the BufferedInputStream with the content part of the HTTP reply
docBuilder = docBuilderFactory.newDocumentBuilder(); // throws exception.
Document doc = docBuilder.parse
    (new PrependInputStream(bis,
                "<?xml version='1.0' encoding='"+charset+"' ?>\r\n"));
由于我不太担心HTML内容是否有效(格式良好就足够了),所以我尝试了
docBuilderFactory.setValidating(false)
,但这似乎并不妨碍在线检索DTD

尝试使用手动检索的同一dtd文件手动设置带有
docBuilderFactory.setSchema()
的架构会导致“org.xml.sax.SAXParseException:根元素前面的文档中的标记必须格式正确”(这不是一个好主意)

我把事情复杂化到哪里去了


(XML后端似乎是com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema,从堆栈跟踪中可以看出——如果有任何用处的话)。

HTML dtd很大,使用includes。你是对的,它们需要永远。使用一个。人们可以在本地存储DTD,并通过系统ID映射它们

如果您使用像maven这样的工具,您将找到足够的指针


正如@sylvainulg链接的答案所示,i.o.拦截实体的优势在于,您可以接收正确的字符。

有答案。这个问题可以标记为重复。@Sperberg McQueen:我一点也不奇怪。对于联盟s.a.w3来说,避免被正在进行的代码发出的请求淹没是很正常的。
 send(8, "GET /TR/xhtml1/DTD/xhtml1-transitional.dtd HTTP/1.1\r\nUser-Agent: Java/1.6.0_17\r\nHost: www.w3.org\r\nAccept: 
      text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\nConnection: keep-alive\r\n\r\n", 186, 0)
 recv(8, ...