JavaSAX解析器会破坏XML1.1的属性

JavaSAX解析器会破坏XML1.1的属性,java,xml,sax,xml-1.1,Java,Xml,Sax,Xml 1.1,我使用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> <trk

我使用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>
handler类扩展了
org.xml.sax.helpers.DefaultHandler
,只有一个方法,
startElement
,用于响应trkpt标记的打开:

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标记,所有这些标记都有两个属性,第一个始终称为“lat”,正如我所料,该属性的值始终以“1”开头。太好了

如果xml文件更改为在第一行指定
version=“1.1”
,则我将获得以下输出:

lat = :34.56Z</t
lat = :56Z</time
done

lat=:34.56Z这个bug多年来一直存在于jdkxml解析器中,Sun和Oracle都没有对修复它表现出任何兴趣。我强烈建议优先使用Apache Xerces XML解析器。

这可能与此相关:我觉得XML解析器中有个bug,您使用的是哪个java版本还是哪个XML解析器?另外,属性的顺序不是由xml定义的,最好用
attributes.getValue(“lat”)
替换
attributes.getValue(0)
。正如我所说的,我正在使用JRE的内置sax解析,并尝试了Sun6、OpenJDK6和OpenJDK7。我不在乎第一个属性是lat还是lon,它的值仍然应该以“1”开头。@Sami Korhonen,谢谢你的链接。是的,这听起来像是同一个问题,我只是有很多短属性,而不是一些长属性。不幸的是,他的解决方案是使用xml1.0,但我希望能够读取任何文件。解决方案是使用较新版本的xerces(不是与您的jre捆绑的版本)。我尝试搜索它,但没有找到任何内容。官方的bug追踪器上有报道吗?它标记为wontfix吗?对不起,我不知道。我想我至少五年前就报告过了,但我自己在追踪器里找不到。但有可能我从未报告过,因为当你没有得到回应时,你就放弃报告错误。不管怎样,每隔几个月就会有人在针对Saxon的bug报告中提到这个问题,当他们转而使用ApacheXerces时,bug总是会消失。谢谢。我尝试过Xerces,但(到目前为止)无法以同样的方式失败。因此,我认为对我来说,最好的办法是尝试使用Xerces,如果这不可用,那么就使用内置的sax解析器(它适用于xml 1.0)。@MichaelKay,请您研究一下。我的建议很简单,不要使用JDK解析器,使用Apache的Xerces。
lat = :34.56Z</t
lat = :56Z</time
done