在java中读取xml api响应

pu3pd22g  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(502)

这个问题在这里已经有答案了

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">&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()))); 我做错什么了?

weylhg0b

weylhg0b1#

xml文档应该以

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

结束于

</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

w51jfk4q

w51jfk4q2#

您正在解析的html代码可以由javadom解析器解析,但这可能是巧合:另一个html响应可能包含一些标记,从xml的Angular 来看,这些标记是无效的。如果您100%确定,响应将以xml/xhtml格式出现,这应该不是问题所在,否则切换到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));
    }

相关问题