致命错误:1:1:序言中不允许内容

Posted

技术标签:

【中文标题】致命错误:1:1:序言中不允许内容【英文标题】:Fatal Error :1:1: Content is not allowed in prolog 【发布时间】:2012-07-19 14:47: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 格式有关,但我不知道如何修复它。

【问题讨论】:

Java parsing XML document gives "Content not allowed in prolog." error的可能重复 嗯,据我了解,您所指的线程是关于从磁盘读取 xml。在我的情况下,我的磁盘上没有 xml,我只有一些字符串(链接),在我得到 xml 文件之前出现错误... 你能给出有问题的网址吗?最可能的原因是响应格式错误,因此查看一下会很有价值。 XML 文件的来源无关紧要,错误仍然相同。 “序言中不允许的内容”是指在文件/流的开头发现了其他内容,但不是 开始标记。如果它包含额外的空格,只需修剪它们,但通常这种错误是无法(以编程方式)恢复的。 读完你的cmets后,我手动检查了http页面的响应,它的xml格式确实很糟糕......抱歉打扰你了,我以前从来没有遇到过这样的问题......:\跨度> 【参考方案1】:

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

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

【讨论】:

文件开头的这些奇怪字符是 BOM(字节顺序标记),理想情况下 BOM 不应该出现 utf-8 编码,因为 java 无法解析此类异常并给出上述错误【参考方案2】:

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

【讨论】:

在我的情况下,我使用 java 样式的 cmets 在 xml 中错误地添加了 cmets。例如而不是使用 我使用 /* */ 删除了对我来说相同的修复【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

在某处,我完全错过了使用带有 log4j2 的 YAML 需要 jackson 库,每个 https://www.sentinelone.com/blog/log4j2-configuration-detailed-guide/。将 jackson 引用添加到我的(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 错误消失了。

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

我已经使用Sublime 完成了这项工作

【讨论】:

【参考方案7】:

您似乎忘记在获取请求中添加正确的标头(询问 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")

【讨论】:

以上是关于致命错误:1:1:序言中不允许内容的主要内容,如果未能解决你的问题,请参考以下文章

gradle build error [致命错误] checker-qual-2.5.2.pom:2:1:prolog 中不允许内容

“序言中不允许内容”错误,但在 XML 声明之前没有任何内容

StaX:序言中不允许的内容

序言中不能有内容。在安卓工作室

序言中不允许内容,但序言在运行时可以吗? Groovy,Jenkins,Java,管道,XML [重复]

序言问题中不允许内容