xerces在获取xhtml1-transitional DTD时失速

时间:2013-02-07 10:40:12

标签: java xml dtd

我想在线对XML文档执行XPath查询。我已经设置了InputStreams来检索内容并附加<?xml ...?>标头,该标头声明了HTTP请求的charset字段中存在的编码。虽然它有效但却很慢。

    //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"));

(请允许我这次不要把我的全部资料放在一边:我正在为学生准备作业)。

一些strace分析显示该程序在联系w3.org时失速:

 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, ...

由于我不太担心HTML内容有效(格式良好应该足够),我尝试docBuilderFactory.setValidating(false)但这似乎并不妨碍在线检索DTD。

尝试使用手动检索的相同dtd文件手动设置具有docBuilderFactory.setSchema()的模式会导致“org.xml.sax.SAXParseException:根元素之前的文档中的标记必须很好 - 形成。“(这不是一个好主意)

我在哪里过于复杂?

(XML后端似乎是com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema,据我所知,从堆栈跟踪 - 如果有任何用途)。

1 个答案:

答案 0 :(得分:0)

HTML dtd非常庞大,使用包含。而你是对的,他们永远。使用XML catalog。可以在本地存储dtd并按系统ID映射它们。

如果你使用像maven这样的工具,你会找到足够多的指针。

优点i.o.拦截实体作为@sylvainulg联系的答案表明,你收到了正确的字符。