这个问题在这里已经有答案了:
org.xml.sax.saxparseexception:prolog中不允许内容(31个答案)
上个月关门了。
我想阅读下面的xml响应,但它给出了一个错误。
<html>
<head>
<title>OK</title>
</head>
<body>
<h1>OK</h1>
<table>
<tbody>
<tr>
<td>Status</td>
<td><div id="Status">200</div></td>
</tr>
<tr>
<td>Message</td>
<td><div id="Message">Page created</div></td>
</tr>
<tr>
<td>Location</td>
<td><a href="/content/parentnode/demopage" id="Location">/content/parentnode/demopage</a></td>
</tr>
<tr>
<td>Parent Location</td>
<td><a href="/content/parentnode" id="ParentLocation">/content/parentnode</a></td>
</tr>
<tr>
<td>Path</td>
<td><div id="Path">/content/parentnode/demopage</div></td>
</tr>
<tr>
<td>Referer</td>
<td><a href="" id="Referer"></a></td>
</tr>
<tr>
<td>ChangeLog</td>
<td><div id="ChangeLog"><pre></pre></div></td>
</tr>
</tbody>
</table>
<p><a href="">Go Back</a></p>
<p><a href="/content/parentnode/demopage">Modified Resource</a></p>
<p><a href="/content/parentnode">Parent of Modified Resource</a></p>
</body>
</html>
我试图阅读“页面创建”的消息与下面的代码
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
.parse(new InputSource(new StringReader(response.toString())));
NodeList nodes = doc.getElementsByTagName("div");
if (nodes.getLength() > 0) {
Element ele = (Element) nodes.item(0);
System.out.println("Page created -"
+ ele.getElementsByTagName("//div[contains(@id,'Message')]").item(0).getTextContent());
} else {
}
[Fatal Error] :1:1: Content is not allowed in prolog.
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:262)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
at working.OkhttpCreatePage.main(OkhttpCreatePage.java:40)
第40行是 .parse(new InputSource(new StringReader(response.toString())));
我做错什么了?
2条答案
按热度按时间weylhg0b1#
xml文档应该以
结束于
线程“main”org.xml.sax.saxparseexception中出现异常;行号:1;列数:1;prolog中不允许有内容
这个错误意味着:
文档的<?xml?开头有空格?
您正在读取的文档已加密/压缩,或者包含默认编码无法理解的字符。
在您的例子中,您试图解析一个html文档,是的,它有标记元素,但不是xml文档。
如果你真的想阅读html,我建议你去看看处理这些文档的库。
要以字符串形式读取实际的html文档,请执行以下操作:
https://jsoup.org/cookbook/introduction/parsing-a-document
要直接从web上读取html页,请执行以下操作:
https://www.baeldung.com/java-with-jsoup
w51jfk4q2#
您正在解析的html代码可以由javadom解析器解析,但这可能是巧合:另一个html响应可能包含一些标记,从xml的Angular 来看,这些标记是无效的。如果您100%确定,响应将以xml/xhtml格式出现,这应该不是问题所在,否则切换到jsoup解析器是有意义的,正如另一个答案中所建议的那样。
至于
Content is not allowed in prolog
错误,它可能来自实际xml文档开始之前的空白或其他字符。您可以在解析字符串之前尝试修剪字符串,或者从第一个字符串开始对其进行子串<
将角色进行到底。另外请注意,您的xpath逻辑有点不正确。以下是更正版本: