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 사이에 줄 바꿈을 추가하면 다른 지점에서 문제가 발생하거나 다른 특성 값을 다시 제공합니다.
관련있을 수 있습니다 : http : //andrius.velykis.lt/2012/04/xml-11-long-attributes-in-java-6/ –
xml 파서의 버그와 같은데, 자바 버전이나 xml 파서를 사용하고 있습니까? 또한 속성의 순서는 xml에 의해 정의되지 않기 때문에'attributes.getValue (0)'을'attributes.getValue ("lat")'로 대체하는 것이 더 낫습니다. –
내가 말했듯이 JRE의 내장 된 색소 파싱을 사용하고 있으며 Sun6, OpenJDK6 및 OpenJDK7을 사용해 보았습니다. 첫 번째 속성이 위도 또는 경도인지 상관하지 않습니다. 값은 여전히 '1'로 시작해야합니다. – Penfold