XML

【XML エラー】The markup in the document following the root element must be well-formed

XML-HTML_アイキャッチ.jpg

こんにちは!ゆーたろうです。

Eclipseを使って、XMLファイルを1から作成することを初めて経験しました。

その際にハマったことがあるので、備忘録化していきます。

※最近の統合開発環境を使えば、ある程度書式化されているので、ここで紹介するエラーに直面することはあまりないかも知れませんが、もし1からエディタなどで作る方がいれば、参考にしていただければと思います。

書いたXMLの内容

PostgreSQLデータベースに接続する情報をXMLに書いて、Javaに読みこませるために作ったファイルです。


<?xml version="1.0" encoding="UTF-8"?>
	<Database>
		<host>localhost</host>
		<port>8080</port>
		<dbname>postgres</dbname>
		<user>postgres</user>
		<pass>postgres</pass>
		<encoding>SJIS</encoding>
		<timeout>9000</timeout>
	</Database>
	<ad>
		<Level>info</Level>
	</ad>

さて、みなさんはどこがおかしいかすぐわかりますか?

発生したエラー

Multiple annotations found at this line:
– Start tag of element
– The markup in the document following the root element must
be well-formed.

直訳してみました。

この行に複数の注釈が見つかりました:
-要素の開始タグ
-ルート要素に続くドキュメント内のマークアップは整形式であること。

Google翻訳

技術系の英語は直訳してもさっぱりわけわからないですね^^;

なので、エラー内容を検索したり、正しく動くXMLと見比べたりしてみました。

<ad>の先頭が小文字だからか?と思い<Ad>にしたり、別名にしたり色々試行錯誤して、5分ほど解決に時間がかかってしまいました。。

原因:ルート要素がなかったから

動くようになったXML


<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
	<Database>
		<host>localhost</host>
		<port>8080</port>
		<dbname>postgres</dbname>
		<user>postgres</user>
		<pass>postgres</pass>
		<encoding>SJIS</encoding>
		<timeout>9000</timeout>
	</Database>
	<ad>
		<Level>info</Level>
	</ad>
</Configuration>

上のソースでいうと「<Configration>」の部分が足りなかったからのようでした。

XMLのフォーマットとして、

  • ヘッダ部分があること→例:xml version=”1.0″ encoding=”UTF-8の部分
  • ルート要素があること→例:上のソースでいうConfigrationのブロック

があるようです。

私は初めてXMLを1から書いたので、全然知りませんでした。

他にもいくつか制約がありますが、ひとまず今回私が直面したエラーに対する解決方法は、ルート要素が欠けていたことが原因でした。

参考サイト:XML文書の基本構造を詳しく見ていく

まとめ

  • 今回のエラーは、ルート要素がなかったため
  • XMLは基本フォーマットがあるのでしっかり把握すること
  • 改めて、統合開発環境のありがたみを知れた

最近の傾向として、なるべくフォーマット化できるところは開発環境側でカバーしてミスの最小化・開発時間短縮をすることが多いですが、技術者であればフォーマット1つとっても、しっかりと把握したうえで、使っていきたいですね。

私自身もとても勉強になりました。