【问题标题】:Read XML API Response in Java [duplicate]在 Java 中读取 XML API 响应 [重复]
【发布时间】:2021-02-27 11:27:30
【问题描述】:

我想阅读下面的 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())));

我做错了什么?

【问题讨论】:

标签: java xml xml-parsing


【解决方案1】:

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

至于Content is not allowed in prolog 错误,它可能来自实际 XML 文档开始之前的空格或其他字符。您可以在解析之前尝试修剪字符串,或者从第一个 &lt; 字符到末尾进行子串化。

另外请注意,您的 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));
    }

【讨论】:

  • 确保所有标签也有匹配的结束标签
  • 仍然报同样的错误。我正在使用.parse(new InputSource(new StringReader(response.toString())));
  • 您是否调整了响应? String content = response.toString().trim(); ?
  • 是的,我也试过了。它对你有用吗?
  • 当我将您的 HTML 从 &lt;html&gt; 转移到 &lt;/html&gt; 时,它已成功解析。我会在调试模式下检查响应的内容。它可以在开头包含一些其他字符,
【解决方案2】:

一个 XML 文档应该以

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

结尾
</xml>

线程“主”org.xml.sax.SAXParseException 中的异常;行号:1;列号:1;序言中不允许有内容

这个错误意味着几件事:

  • 您的文档在 的开头有空格
  • 您正在阅读的文档已加密/压缩或包含无法从默认编码中理解的字符。

在您的情况下,您正在尝试解析 HTML 文档,是的,它具有标记元素,但它不是 XML 文档。

如果你真的想阅读 HTML,我建议你研究一个处理此类文档的库。

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

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

直接从网络/或作为响应读取 HTML 页面:

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

【讨论】:

  • 此外,有效的 HTML 并不意味着有效的 XML。某些 HTML 标签没有相关的结束标签(例如:
    等)。
  • 我的 XML 不是以 &lt;?xml version="1.0" encoding="UTF-8"?&gt; 开头的,但它是一个 XML。还有另一种阅读方式。为了删除空格,我使用了response.body().toString().trim();
猜你喜欢
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 2019-08-09
  • 2015-03-02
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2015-10-31
相关资源
最近更新 更多