java在文件的开头读取一个不存在的奇怪字符

时间:2012-02-06 15:53:06

标签: java xml jaxb

我的硬盘上有一个简单的xml文件。 当我用记事本++打开它时,这就是我所看到的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<content>
... more stuff here ...
</content>

但是当我使用FileInputStream阅读时,我得到了:

?<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<content>...

我正在使用JAXB来解析xml,并且因为“?”而抛出了“prolog中不允许的内容”的异常。标志。

这是什么额外的“?”标志?它为什么存在,我该如何摆脱它?

6 个答案:

答案 0 :(得分:7)

额外的字符是byte order mark,这是一个特殊的Unicode字符代码,它允许XML解析器知道文件中字节的字节顺序(小端或大端)是什么。

通常,您的XML解析器应该能够理解这一点。 (如果没有,我会认为XML解析器中存在错误。)

作为一种解决方法,请确保生成此XML的程序不会使用BOM。

答案 1 :(得分:2)

检查文件的编码,我见过类似的事情,在大多数编辑器中打开文件,它看起来很好,原来它是用UTF-8编码而没有BOM(或者用,我不记得了我的头顶)。 Notepad ++应该可以在两者之间切换。

答案 2 :(得分:1)

您可以使用Notepad ++查看View > Show Symbols > Show All Characters菜单中的所有符号。它会显示开头的额外字节。它有可能是字节顺序标记。如果额外的字节确实是字节顺序标记,这种方法无济于事。在这种情况下,您需要下载十六进制编辑器,或者如果安装了Cygwin,请按照此响应的最后一段中的步骤操作。一旦您可以使用十六进制代码查看文件,请查找前两个字符。他们是否有http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

中提到的代码之一

如果它们确实是字节顺序标记,或者如果您无法确定错误原因,请尝试以下操作:

从菜单中选择Encoding > Encoding in UTF-8 without BOM,然后保存文件。

(在Linux上,可以使用命令行工具检查开头的内容。例如xxd -g1 filename | headod -t cx1 filename | head。)

答案 3 :(得分:0)

您可能有换行符。删除它。

在Notepad ++中选择View > Show Symbol > Show All Characters以查看正在发生的事情。

答案 4 :(得分:0)

这不是jaxb问题,问题在于您使用读取xml的方式...尝试使用输入流

...
Unmarshaller u = jaxbContext.createUnmarshaller();
XmlDataObject xmlDataObject = (XmlDataObject) u.unmarshal(new FileInputStream("foo.xml"));
...

答案 5 :(得分:0)

在FileInputStream旁边,ByteArrayInputStream也和我一起工作:

JAXB.unmarshal(new ByteArrayInputStream(string.getBytes("UTF-8")), Delivery.class);

=&GT;没有解组错误。