XMLファイルの読み込みでSAXParseException: Content is not allowed in prolog.

普段はpropertiesファイルを使ってますが、少し前にxmlファイルを扱う機会がありました。

そっちの処理はまたいずれ記事にするとして、今回はxmlファイルの読み込み時に以下のエラーが発生しました。

org.xml.sax.SAXParseException;  lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.

日本語環境だと「プロローグにコンテンツは許されません。」というエラーメッセージになります。

 

調べてみると、UTF-8xmlファイルを読み込もうとしたけどBOM付きだったため、という理由が多かったです。

ところが、複数のテキストエディタxmlファイルを確認してもUTF-8のBOM無しだし、バイナリエディタで見ても余計なデータは見つからず、果てにはShift-JISにしても同様のエラーでした。

 

 

話のオチとしてはつまらないもので、以下のようなコードを書いてて発生しました。

InputStream is = new FileInputStream("hoge.xml");
is.read();
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);

xml相対パスがあっているかを確認するため、とりあえずreadしてみようと書いてた2行目がまさに原因でした。

このせいでファイルを変にロックしていたのか、表題のエラーが発生していました。消すと通ります。

 

それにしても、xmlは食わず嫌いでしたが、慣れるとかなり使いやすそうです。XPathが無かったら微妙でしたけれど。