4

私は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の間に改行を追加すると、問題はさまざまなポイントで発生したり、さまざまな属性値を返したりします。

4

1 に答える 1

3

このバグはJDKXMLパーサーに何年も存在しており、SunもOracleもこのバグの修正に関心を示していません。ApacheXercesXMLパーサーを優先的に使用することを強くお勧めします。

于 2013-03-26T14:49:10.923 に答える