我想在线对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,据我所知,从堆栈跟踪 - 如果有任何用途)。
答案 0 :(得分:0)
HTML dtd非常庞大,使用包含。而你是对的,他们永远。使用XML catalog。可以在本地存储dtd并按系统ID映射它们。
如果你使用像maven这样的工具,你会找到足够多的指针。
优点i.o.拦截实体作为@sylvainulg联系的答案表明,你收到了正确的字符。