2013-03-26 2 views
4

xml 파일을 구문 분석하기 위해 java의 sax 클래스를 사용하고 있습니다. xml 파일이 버전 1.0이라면 모든 것이 정상적으로 작동하지만 버전 1.1이라고하면 속성 중 일부는이 엉망이되어 잘못된 결과가 나오지만 예외는 발생하지 않습니다.java sax 파서가 xml 1.1의 속성을 mangles

내 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 태그를 찾기 위해, 그리고 그들 각각의 위도와 경도 가지고 속성. 특히, 나는 모두 "12.3456789"인 420 "lat"속성을 찾을 것으로 기대합니다.

SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); 
inStream = new FileInputStream(file); 
saxParser.parse(inStream, handler); 
System.out.println("done"); 

핸들러 클래스 org.xml.sax.helpers.DefaultHandler 연장 바로 trkpt 태그의 개구에 대응하는 하나의 방법으로서, startElement이있다 : I는 핸들러 객체를 생성하고,이 로컬 파일 그것을 스트림을주는 파싱

:

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 

그래서 내 모든 420 포인트가 동일해야하더라도, 그들 중 두 사람은 나에게 완전히했다 잘못된 속성 값. 예외는 발생하지 않습니다. 여전히 420 trkpts가 발견되었고, 모두 lat와 lon이라는 두 가지 속성이 있습니다. 이상하게도 lon 값은 항상 괜찮습니다.

첫 번째 trkpt를 직접 복사/붙여 넣기하여이 xml 파일을 텍스트 편집기에서 만들었으므로 모든 값이 동일하다는 것을 확신합니다. 재미있는 속성 값이있는 xml 파일에는 아무런 포인트가 없습니다. , 나는 아스키가 아닌 문자 값이나 엔티티 코드가 없거나 그 파일에 이상한 것이 없다고 확신한다.

두 개의 서로 다른 OS가있는 세 대의 다른 컴퓨터에서 Sun의 JRE6, OpenJDK6 및 OpenJDK7을 사용해 보았습니다. 그래서 뭔가 잘못된 일을하고 있거나이 XML 파일이 xml1.1과 어떻게 든 호환되지 않습니다. 또는 광범위한 색소폰 버그가 있습니다 (많은 사람들에게 영향을 미칠 것으로 예상되는 것처럼 보이지는 않습니다). 다시 말하지만 xml1.0에서는 모두 잘 작동합니다. 또한 숫자 420에는 특별한 것이 없습니다. 단지 파일에 100 개의 항목 만 있으면 제대로 파싱됩니다. 수천 개의 항목이있는 경우 특정 수의 항목이 첫 번째 속성 값을이 방식으로 변경합니다. 속성 값의 길이는 항상 정확하지만 파일의 잘못된 지점에서 문자를 가져옵니다. 아마도 인덱스 오버플로입니까?

모든 속도 태그를 제거하려고했지만 trkpt가 충분하면 문제가 지속됩니다. 추가 공백에 민감하기 때문에 trkpts 사이에 줄 바꿈을 추가하면 다른 지점에서 문제가 발생하거나 다른 특성 값을 다시 제공합니다.

+2

관련있을 수 있습니다 : http : //andrius.velykis.lt/2012/04/xml-11-long-attributes-in-java-6/ –

+0

xml 파서의 버그와 같은데, 자바 버전이나 xml 파서를 사용하고 있습니까? 또한 속성의 순서는 xml에 의해 정의되지 않기 때문에'attributes.getValue (0)'을'attributes.getValue ("lat")'로 대체하는 것이 더 낫습니다. –

+0

내가 말했듯이 JRE의 내장 된 색소 파싱을 사용하고 있으며 Sun6, OpenJDK6 및 OpenJDK7을 사용해 보았습니다. 첫 번째 속성이 위도 또는 경도인지 상관하지 않습니다. 값은 여전히 ​​'1'로 시작해야합니다. – Penfold

답변

3

이 버그는 수년간 JDK XML 파서에 있었으며 Sun이나 Oracle도 수정에 관심을 보이지 않았습니다. Apache Xerces XML 구문 분석기를 사용하는 것이 좋습니다.

+0

검색을 시도했지만 아무 것도 찾지 못했습니다. 공식적인 버그 추적기 나 그 밖의 것들에보고 되었습니까? 그것이 wontfix로 표시되어 있습니까? – Penfold

+0

죄송합니다, 모르겠습니다. 나는 적어도 5 년 전에 그것을보고했다고 생각하지만 나는 추적자에서 그것을 스스로 발견하는 데 어려움을 겪었다. 하지만 아무런 반응이 없을 때 버그를보고하기를 포기했기 때문에 결코보고하지 않을 수도 있습니다. 어쨌든 누군가가 Saxon을 상대로 제기 한 버그 보고서에 몇 달에 한 번씩 나타나며 Apache Xerces를 사용하여 전환 할 때 버그는 항상 사라집니다. –

+1

감사합니다. 나는 Xerces로 시도했고 (지금까지) 같은 방식으로 실패 할 수 없었다. 그래서 내가해야 할 일은 Xerces를 사용하는 _attempt_에 대한 것이고 사용 가능하지 않다면 xml 1.0에서는 잘 작동하는 내장 된 색소 파서로 돌아가는 것입니다. – Penfold

관련 문제