0

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

    //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。

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

我在哪里使事情过于复杂?

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

4

1 回答 1

0

HTML dtd 很大,使用包含。你是对的,它们需要永远。使用XML 目录。可以在本地存储 dtds 并通过它们的系统 ID 映射它们。

如果你使用一个工具,比如 maven,你会发现足够多的指针。

正如@sylvainulg 所链接的答案所暗示的那样,拦截实体的优势是您收到了正确的字符。

于 2013-02-07T14:15:16.530 回答