我想在线对 XML 文档执行 XPath 查询。我已经设置了 InputStreams 来检索内容并附加一个<?xml ...?>
标头,该标头声明charset
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"));
(请允许我这次不要放我的全部资料:我正在为学生准备作业)。
一些 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 ——如果这有任何用处的话)。