javaは存在しないファイルの先頭に奇妙な文字を読み込みます

私はハードドライブにシンプルなXMLファイルを持っています。 私がメモ帳でそれを開くと+これは私が見るものです:

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

... more stuff here ...

しかし、 FileInputStream を使って読むと、次のようになります。

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

私はJAXBを使ってxmlを解析しています。そのために、「プロローグで許可されていないコンテンツ」の例外がスローされます。符号。

この余分なものは何ですか? "符号?それはなぜそこにあり、どうやってそれを取り除くのですか?

4
最初の数文字を削除して再保存することもできます。
追加された 著者 Dave Newton,

6 答え

その余分な文字は、バイトオーダーマークです。特殊なUnicode文字コードで、XMLパーサーはファイル内のバイトのバイトオーダ(リトルエンディアンまたはビッグエンディアン)は。

通常、XMLパーサーはこれを理解できるはずです。 (もしそうでなければ、XMLパーサーのバグだと思います)。

回避策として、このXMLを生成するプログラムがBOMから離れることを確認してください。

7
追加された

ファイルのエンコーディングをチェックすると、私は似たようなことを見てきました。ほとんどのエディタでファイルを開いていて、うまく見えましたが、BOMなしでUTF-8でエンコードされていました(または、私の頭)。メモ帳+ +は、2つの間で切り替えるには大丈夫です。

2
追加された

You can use Notepad++ to see show all symbols from the View > Show Symbols > Show All Characters menu. It would show you the extra bytes present in the beginning. There is a possibility that it is the byte order mark. If the extra bytes are indeed byte order mark, this approach would not help. In that case, you will need to download a hex editor or if you have Cygwin installed, follow the steps in the last paragraph of this response. Once you can see the file in terms of hex codes, look for the first two characters. Do they have one of the codes mentioned at http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

実際にバイトオーダーのマークが付いている場合や、エラーの原因を特定できない場合は、次のようにしてください:

From the menu select, Encoding > Encoding in UTF-8 without BOM, and then save the file.

(Linuxでは、コマンドラインツールを使用して、 xxd -g1 filename | head od -t cx1 filename | head など)を確認することができます。

1
追加された
notepad ++トリックをありがとう:)
追加された 著者 samz,

これはjaxbの問題ではありません。問題はxmlを読み込むための方法にあります。

...
Unmarshaller u = jaxbContext.createUnmarshaller();
XmlDataObject xmlDataObject = (XmlDataObject) u.unmarshal(new FileInputStream("foo.xml"));
...
0
追加された
あなたの権利は、FileInputStreamを使って動作します。私はxmlを受け取るサーブレットに取り組んでおり、最初にファイルに書き込まずにメモリ内で読み込みます。だから、私はファイルを一時的なものに読み込み、それをXMLパーサに渡していました。 xmlパーサーは、 "一時的な"入力ストリームを受け入れませんでした。
追加された 著者 samz,

改行があるかもしれません。それを削除します。

Select View > Show Symbol > Show All Characters in Notepad++ to see what's happening.

0
追加された

FileInputStreamの次にByteArrayInputStreamも私と一緒に働いた:

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

=> No unmarshaling error anymore.

0
追加された