30

我正在使用 Java,我正在尝试从一些 http 链接获取 XML 文档。我正在使用的代码是:

URL url = new URL(link);

HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
Document doc = null;

CountInputStream in = new CountInputStream(url.openStream());
doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);

不要注意CountInputStream,它是一些像常规输入流一样的特殊类。

使用上面的代码,我有时会遇到错误Fatal Error :1:1: Content is not allowed in prolog。我认为这与 xml 格式错误有关,但我不知道如何修复它。

4

7 回答 7

31

我正在将我的评论变成一个答案,所以它可以被接受,这个问题不再没有答案。

最可能的原因是格式错误的响应,其中包括初始<?xml …&gt;. 因此,请查看通过 HTTP 传输的文档,并在服务器端修复此问题。

于 2012-07-22T21:02:24.753 回答
8

在 XML 前导 ( ) 之前肯定有一些奇怪的字符(例如BOM<?xml ...?> )或一些空格?

于 2012-07-20T11:06:44.010 回答
1

我为这个问题找到的真正解决方案是禁用任何 XML 格式后处理器。我添加了一个名为“ jp@gc - XML Format Post Processor”的后处理器并开始注意到错误“ Fatal Error :1:1: Content is not allowed in prolog

通过禁用后处理器已经停止抛出这些错误。

于 2018-07-31T16:46:15.017 回答
1

我想要 log4j2 配置文件的 YAML,因为它消除了 XML 的视觉混乱,但与 Guest96 有相同的错误。我在网上搜索了上述问题的解决方案,调查了 Utf-8 BOM 或 YAML 标头区域中的其他内容;没有喜悦。当然,答案通常很简单。

在某个地方,我完全错过了使用 YAML 和 log4j2 需要杰克逊库,每个https://www.sentinelone.com/blog/log4j2-configuration-detailed-guide/。将杰克逊引用添加到我的(Gradle)配置解决了这个问题:

// Gain support for log4j2.
// https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j
implementation 'org.apache.logging.log4j:log4j-api:2.14.1'
implementation 'org.apache.logging.log4j:log4j-core:2.14.1'

// Gain support for YAML with log4j2.
// https://www.sentinelone.com/blog/log4j2-configuration-detailed-guide/
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.10.0'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.0'

这样,可怕的Fatal Error :1:1: Content is not allowed in prolog错误就消失了。

于 2021-11-12T17:48:37.310 回答
0

有人应该将 Johannes Weiß 的评论标记为这个问题的答案。这就是为什么 xml 文档不能只加载到 DOM Document 类中的原因。

http://en.wikipedia.org/wiki/Byte_order_mark

于 2013-11-13T09:04:46.413 回答
0

可能不支持文件编码。例如,将其更改为 UTF-8。

我已经使用Sublime完成了这个

于 2020-09-24T08:45:52.843 回答
-2

看起来您忘记在获取请求中添加正确的标头(询问 REST API 开发人员或您的特定 API 描述):

HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.header("Accept", "application/xml")
connection.setRequestMethod("GET");
connection.connect();

或者

connection.header("Accept", "application/xml;version=1")
于 2018-05-29T06:01:50.453 回答