XMLスキーマ変換ツール trang を使ってみた。
スキーマの種別は指定する拡張子で判断してくれるようだ。
比較的単純な XML だと問題なくスキーマを作成してくれたが
巨大で複雑な(1500行くらいある)XMLを指定すると、ConcurrentModificationException が発生した。
$ java -jar trang.jar foobar.xml foobar.dtd Exception in thread "main" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(Unknown Source) at java.util.AbstractList$Itr.next(Unknown Source) at com.thaiopensource.relaxng.input.xml.Inferrer.<init>(Unknown Source) at com.thaiopensource.relaxng.input.xml.Inferrer.infer(Unknown Source) at com.thaiopensource.relaxng.input.xml.XmlInputFormat.load(Unknown Source) at com.thaiopensource.relaxng.input.AbstractMultiInputFormat.load(Unknown Source) at com.thaiopensource.relaxng.translate.Driver.doMain(Unknown Source) at com.thaiopensource.relaxng.translate.Driver.main(Unknown Source)
java.util.ConcurrentModificationException
はイテレーション中にコレクションが変更された場合に発生する例外
なので、XMLの要素を繰り返し処理する部分で別スレッドから更新されて
発生しているのかもしれない。