在Java中读取XML API响应
我想阅读下面的XML响应,但它给出了一个错误在Java中读取XML API响应,java,xml,xml-parsing,Java,Xml,Xml Parsing,我想阅读下面的XML响应,但它给出了一个错误 <html> <head> <title>OK</title> </head> <body> <h1>OK</h1> <table> <tbody> <tr> <td>Status</td>
<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>
第40行是.parse(新的InputSource(新的StringReader(response.toString()))代码>
我做错了什么?XML文档应该以
<?xml version="1.0" encoding="UTF-8"?>
以
</xml>
线程“main”org.xml.sax.saxpasseeption中的异常;行号:1;列数:1;prolog中不允许包含内容
此错误意味着以下几点:
- 您的文档在的开头有空格,您正在解析的HTML代码可以由Java DOM解析器解析,但这可能是巧合:另一个HTML响应可能包含一些标记,从XML的角度来看,这是无效的。如果您100%确定,响应将以XML/XHTML格式出现,这不应该是问题所在,否则切换到JSoup解析器是有意义的,正如另一个答案中所建议的那样
至于prolog中不允许的内容
错误,它可能来自实际XML文档开头之前的空格或其他字符。您可以在解析字符串之前尝试修剪字符串,或者从第一个开始对其进行子串,这是否回答了您的问题?此外,有效的HTML并不意味着也有有效的XML。某些HTML标记没有相关的结束标记(例如:,
等)。我的XML不是以
开头,而是XML。那么,还有其他的阅读方法吗。为了删除空格,我使用了response.body().toString().trim()代码>确保所有标记都有匹配的结束标记也将给出相同的错误。我正在使用.parse(新的InputSource(新的StringReader(response.toString()))代码>您是否删除了响应<代码>字符串内容=response.toString().trim()代码>?是的,我也试过了。它对你有用吗?当我将你的HTML从
转换到
时,它被成功解析了。我会在调试模式下检查响应的内容。它可以在开头包含一些其他字符,
</xml>
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));
}