Javax xml parser застрял при сборке из входного потока HTTP
Я пытаюсь открыть HTTP-соединение с веб-сайтом и разобрать HTML в org.w3c.dom.Document
учебный класс. Я могу открыть HTTP-соединение и вывести веб-страницу на консоль просто отлично, но если я передам объект InputStream анализатору XML, он будет зависать на минуту и выдает ошибку
[Fatal Error] :108:55: Open quote is expected for attribute "{1}" associated with an element type "onload".
Код:
private static Document getInputStream(String url) throws IOException, SAXException, ParserConfigurationException
{
System.out.println(url);
URL webUrl = new URL(url);
URLConnection connection = webUrl.openConnection();
connection.setConnectTimeout(60 * 1000);
connection.setReadTimeout(60 * 1000);
InputStream stream = connection.getInputStream();
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(stream); // This line is hanging
return doc;
}
Трассировка стека в режиме паузы:
Thread [main] (Suspended)
SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]
SocketInputStream.read(byte[], int, int) line: not available
BufferedInputStream.fill() line: not available
BufferedInputStream.read1(byte[], int, int) line: not available
BufferedInputStream.read(byte[], int, int) line: not available
HttpClient.parseHTTPHeader(MessageHeader, ProgressSource, HttpURLConnection) line: not available
HttpClient.parseHTTP(MessageHeader, ProgressSource, HttpURLConnection) line: not available
HttpURLConnection.getInputStream() line: not available
XMLEntityManager.setupCurrentEntity(String, XMLInputSource, boolean, boolean) line: not available
XMLEntityManager.startEntity(String, XMLInputSource, boolean, boolean) line: not available
XMLEntityManager.startDTDEntity(XMLInputSource) line: not available
XMLDTDScannerImpl.setInputSource(XMLInputSource) line: not available
XMLDocumentScannerImpl$DTDDriver.dispatch(boolean) line: not available
XMLDocumentScannerImpl$DTDDriver.next() line: not available
XMLDocumentScannerImpl$PrologDriver.next() line: not available
XMLNSDocumentScannerImpl(XMLDocumentScannerImpl).next() line: not available
XMLNSDocumentScannerImpl.next() line: not available
XMLNSDocumentScannerImpl(XMLDocumentFragmentScannerImpl).scanDocument(boolean) line: not available
XIncludeAwareParserConfiguration(XML11Configuration).parse(boolean) line: not available
XIncludeAwareParserConfiguration(XML11Configuration).parse(XMLInputSource) line: not available
DOMParser(XMLParser).parse(XMLInputSource) line: not available
DOMParser.parse(InputSource) line: not available
DocumentBuilderImpl.parse(InputSource) line: not available
DocumentBuilderImpl(DocumentBuilder).parse(InputStream) line: not available
MSCommunicator.getInputStream(String) line: 45
MSCommunicator.getGamePageFromForum(int, int, int) line: 70
MSCommunicator.getGamePageFromForum(int, int) line: 57
Game.<init>(int, int) line: 21
MSCommunicator.main(String[]) line: 26
2 ответа
Даже если полученная вами HTML-страница является правильным и правильно сформированным HTML, это может быть не правильно сформированный XML. Например, это действительно в HTML4:
<p class=myclass>Paragraph<br>Next line</p>
Тогда как в XML (XHTML) это считается действительным:
<p class="myclass">Paragraph<br/>Next line</p>
Обратите внимание на закрытый <br/>
тег и цитата вокруг атрибута класса p
тег.
Кроме того, межсетевые пространства - это дикое место, поэтому контент вряд ли будет хорошо сформирован, поэтому вам нужно "взять все с крошечной солью" - даже правильной формы, так что вам придется использовать HTML более чистый, как jTidy или nekoHTML.
Вы не можете просто ожидать, что парсит HTML в дерево XML DOM. Это не обязательно будет действительный XML. Вы, вероятно, должны сначала очистить его. Смотрите ответы на этот вопрос: