JavaSAX解析器会破坏XML1.1的属性
我使用java的sax类来解析xml文件。如果xml文件的版本为1.0,则一切正常,但如果文件的版本为1.1,则某些属性会被破坏,给出错误的结果,但不会引发任何异常 我的xml文件基本上如下所示: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
<?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