私はJavaのsaxクラスを使用してxmlファイルを解析しています。xmlファイルにバージョン1.0と記載されている場合はすべて正常に機能しますが、バージョン1.1と記載されている場合は、一部の属性が破損し、間違った結果が得られますが、いかなる種類の例外もスローされません。
私のxmlファイルは基本的に次のようになります。
<?xml version="1.1" encoding="UTF-8" ?>
<gpx>
<trk>
<name>Name of the track</name>
<trkseg>
<trkpt lat="12.3456789" lon="1.2345678">
<ele>1234</ele>
<time>2013-03-26T12:34:56Z</time>
<speed>0</speed>
</trkpt>
... and then 419 further identical copies of this trkpt
</trkseg>
</trk>
</gpx>
したがって、saxを使用してこのファイルを解析するときに期待するのは、420個のtrkptタグを見つけ、それぞれにlat属性とlon属性を持たせることです。特に、すべて「12.3456789」である420個の「lat」属性が見つかると思います。
解析のために、ハンドラーオブジェクトを作成し、このローカルファイルへのストリームを提供します。
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
inStream = new FileInputStream(file);
saxParser.parse(inStream, handler);
System.out.println("done");
ハンドラークラスは拡張され、trkptタグの開始に反応するためのorg.xml.sax.helpers.DefaultHandler
メソッドが1つだけあります。startElement
public void startElement(String uri, String localName, String qName, Attributes attributes)
{
if (qName.equals("trkpt") && attributes != null
&& attributes.getLength() == 2
&& attributes.getValue(0).charAt(0) != '1')
{
// The trkpt tag has two attributes
// but the value of the first one doesn't begin with '1'
System.out.println(attributes.getQName(0) + " = " + attributes.getValue(0));
}
super.startElement(uri, localName, qName, attributes);
}
では、結果はどうなるのでしょうか。xmlファイルのバージョンが1.0の場合、表示されるのは「完了」だけです。420個のtrkptタグが見つかりました。それらはすべて、2つの属性を持っていました。最初のタグは常に「lat」と呼ばれ、この属性の値は、予想どおり常に「1」で始まりました。素晴らしい!
xmlファイルを変更しversion="1.1"
て最初の行で指定すると、次の出力が得られます。
lat = :34.56Z</t
lat = :56Z</time
done
したがって、420ポイントはすべて同じであるはずですが、そのうちの2つは完全に間違った属性値を与えてくれました。例外はスローされません。それでも420のtrkptが見つかり、すべてに「lat」と「lon」という2つの属性がありました。奇妙なことに、lon値は常に問題ありません。
このxmlファイルは、最初のtrkptを直接コピーして貼り付けることでテキストエディターで作成したので、すべての値が同じであり、xmlファイルに面白い属性値を持つポイントがないことを確認します。非ASCII文字値やエンティティコードなど、ファイルに奇妙なものがないことを確認してください。
SunのJRE6、OpenJDK6、OpenJDK7を使用して、2つの異なるOSを備えた3つの異なるマシンで試してみました。したがって、私が何か間違ったことをしている、またはこの特定のxmlファイルが何らかの形でxml1.1と互換性がない、または広範囲にわたるsaxバグがあります(多くの人に影響を与えると予想されるため、これはありそうにないようです)。繰り返しになりますが、xml1.0ではすべて正常に機能することに注意してください。また、420という数字については特別なことは何もありません。ファイルに100個のエントリしかない場合、それらはすべて適切に解析されるということです。数千のエントリがある場合、それらの特定の数は、この方法で最初の属性値をマングルします。属性値の長さは常に正しいように見えますが、ファイル内の間違ったポイントから文字が引き出されています。おそらくインデックスオーバーフロー?
すべての速度タグを削除しようとしましたが、十分なtrkptがある場合でも問題は解決しません。また、追加の空白にも敏感であるため、trkptの間に改行を追加すると、問題はさまざまなポイントで発生したり、さまざまな属性値を返したりします。