Java 解析 XML 文档给出“Prolog 中不允许的内容”。错误[重复]
Posted
技术标签:
【中文标题】Java 解析 XML 文档给出“Prolog 中不允许的内容”。错误[重复]【英文标题】:Java parsing XML document gives "Content not allowed in prolog." error [duplicate] 【发布时间】:2011-02-05 16:39:55 【问题描述】:我正在用 Java 编写一个程序,它接受一个自定义 XML 文件并对其进行解析。我正在使用 XML 文件进行存储。我在 Eclipse 中收到以下错误。
[Fatal Error] :1:1: Content is not allowed in prolog.
org.xml.sax.SAXParseException: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:239)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283 )
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:208)
at me.ericso.psusoc.RequirementSatisfier.parseXML(RequirementSatisfier.java:61)
at me.ericso.psusoc.RequirementSatisfier.getCourses(RequirementSatisfier.java:35)
at me.ericso.psusoc.programs.RequirementSatisfierProgram.main(RequirementSatisfierProgram.java:23 )
包含 XML 文件的开头:
<?xml version="1.0" ?>
<PSU>
<Major id="IST">
<name>Information Science and Technology</name>
<degree>B.S.</degree>
<option> Information Systems: Design and Development Option</option>
<requirements>
<firstlevel type="General_Education" credits="45">
<component type="Writing_Speaking">GWS</component>
<component type="Quantification">GQ</component>
该程序能够读取 XML 文件,但是当我调用 DocumentBuilder.parse(XMLFile)
以获取已解析的 org.w3c.dom.Document
时,出现上述错误。
在我看来,我的 XML 文件的序言中没有无效内容。我不知道出了什么问题。请帮忙。谢谢。
【问题讨论】:
我发现了我的错误。我正在阅读文件所在的文件夹,而不是文件本身。显然,如果您将文件夹作为文件读取并在其上调用 File.exists(),它仍然会返回 true。愚蠢的我......感谢所有的帮助。 在***.com/questions/3665554/…查看我的答案,或者直接查看这个链接mark.koli.ch/2009/02/… 不知道它是否会帮助任何人,但我在尝试使用 flavorDimensions 并将 drawable-xhdpi 置于我的风格中的 res 下时遇到了这个错误。一旦我将其更改为可绘制.. 全部固定 【参考方案1】:该文档对我来说看起来不错,但我怀疑它包含不可见的字符。在十六进制编辑器中打开它,检查第一个“”之前的空格。检查使用了哪些换行符。
确保文档是正确的 UTF-8。一些 Windows 编辑器将文档保存为 UTF-16(即每隔一个字节为 0)。
【讨论】:
我一直在 Eclipse 文本编辑器中编辑 XML 文件。我在 Mac 上,我也使用 BBEdit。我会检查隐形字符。 我在 BBEdit(查看 > 文本显示 > 显示不可见)中检查了不可见字符,但在 XML 声明中没有看到任何不可见字符。我还删除了声明末尾的空格。我添加了 encoding="UTF-8" 和 encoding="UTF-16,但仍然出现错误。 文件的编码是什么?即不是你的想法,而是你的编辑怎么说? 还要确保您实际上正在查看导致错误的文件! 我检查了BBEdit中的编码类型;它是 UTF-16。我很确定我正在查看正确的文件。以下是我读取文件并解析它的代码: File f = new File("/Users/thechiman/Dropbox/introcs/PSU SOC Crawler/src/resources"); //检查文件是否存在 if(f.exists()) System.out.println("file exists"); else System.out.println("文件不存在"); //使用工厂获取一个新的DocumentBuilder DocumentBuilder db = dbf.newDocumentBuilder(); //解析XML文件,得到DOM表示 this.dom = db.parse(f);【参考方案2】:确保 XML 文件的开头没有隐藏空格。也可能在节点中包含 encoding="UTF-8"(或 16?没有线索)。
【讨论】:
不幸的是,这很可能是原因。 在 BBEdit 中检查隐藏字符并将编码属性添加到 XML 声明中。两者都没有解决。【参考方案3】:如果您能够控制 xml 文件,请尝试在文件开头添加更多信息:
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
【讨论】:
我已经添加了standalone="no" 和standalone="yes"。两者都给我同样的错误。 hmmm...接下来我要尝试的是蛮力 - 尝试通过解析器获取一个虚拟文档,然后慢慢添加原始文档的部分内容,直到您可以识别问题为止。我以前一直在这条路上:-)【参考方案4】:检查 XML 文件中的任何语法问题。我在使用 Cocoon 处理 xsl/xsp 时发现了这个错误,我使用不存在的节点或类似的东西定义了一个变量。 检查整个 XML。
【讨论】:
在对已解析的文档进行任何操作之前,我得到了错误。当我调用 DocumentBuilder.parse(XMLFile) 时它失败了。我通过一个 XML 验证器 (xmlvalidation.com) 运行了 XML 文件,结果很好。 文件是否在指定位置可用?也许您的程序无法访问文件的内容,解析器只是说它发现的不是 xml 有效的......只是猜测。 @Alfabravo 略有不同的问题,你知道如果我得到一个解析错误我怎么能捕捉到这个异常。 java中的文档构建器不会抛出异常而是在错误流上打印,那么如果提供了损坏的文件,我如何通知用户??【参考方案5】:请检查xml文件是否有这样的垃圾字符。如果存在,请使用以下语法将其删除。
String XString = writer.toString();
XString = XString.replaceAll("[^\\x20-\\x7e]", "");
【讨论】:
我发现这个非常简单的技术作为快速修复非常有用。不过,为了保留换行符,您可能更喜欢正则表达式replaceAll("[^\\x20-\\x7e\\x0A]", "");
注意:这将删除所有 Unicode 字符,而且大部分不是人们想要的。【参考方案6】:
我假设您有正确的 xml 编码并与 Schema 匹配。
如果您仍然收到此错误,请检查将您使用的 xml 和输入类型解组的代码。因为 XML 文档声明了它们自己的编码,所以最好从 InputStream 而不是从 Reader 创建 StreamSource 对象,以便 XML 处理器可以正确处理声明的编码 [Ref Book: Java in A Nutshell]
希望这会有所帮助!
【讨论】:
【参考方案7】:我觉得这也是解决这个问题的办法。
将您的文档类型从 '以 UTF-8 编码'更改为 '以 UTF-8 编码而不使用 BOM'
我通过进行相同的更改解决了我的问题。
【讨论】:
【参考方案8】:您没有提供正确的文件地址。您需要提供一个地址,例如C:/Users/xyz/Desktop/myfile.xml
【讨论】:
OP 发现并在问题评论中指出以上是关于Java 解析 XML 文档给出“Prolog 中不允许的内容”。错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章