阅读Java中的XML API响应



我想阅读下面的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">&lt;pre&gt;&lt;/pre&gt;</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())));

我做错了什么?

您正在解析的HTML代码可以由Java DOM解析器解析,但这可能是一个巧合:另一个HTML响应可能包含一些标记,从XML的角度来看,这些标记是无效的。如果您100%确定响应将以XML/XTML格式出现,那么这不应该是问题所在,否则切换到JSoup解析器是有意义的,正如另一个答案中所建议的那样。

至于Content is not allowed in prolog错误,它可能来自实际XML文档开头之前的空白或其他字符。您可以在解析字符串之前尝试修剪它,或者将它从第一个<字符减到最后。

另外请注意,您的XPath逻辑有点不正确。以下是更正后的版本:

Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder()
.parse(new InputSource(new StringReader(xml)));
NodeList nodes = doc.getElementsByTagName("div");
if (nodes.getLength() > 0) {
Element ele = (Element) nodes.item(0);
System.out.println("Page created - "
+ XPathFactory.newInstance().newXPath().evaluate("//div[contains(@id,'Message')]", ele));
}

XML文档应该以开头

<?xml version="1.0" encoding="UTF-8"?>

并以结束

</xml>

线程中的异常";主";org.xml.ax.SAXParseException;行号:1;columnNumber:1;prolog 中不允许有内容

这个错误意味着一些事情:

  • 您的文档在<?xml
  • 您正在阅读的文档是加密/压缩的,或者包含无法从默认编码中理解的字符

在您的案例中,您试图解析HTML文档,是的,它有标记元素,但它不是XML文档。

如果你真的想阅读HTML,我建议你去看看处理此类文档的库。

以字符串形式读取实际HTML文档:

https://jsoup.org/cookbook/introduction/parsing-a-document

要直接从web读取HTML页面/或作为响应:

https://www.baeldung.com/java-with-jsoup

最新更新