2009-09-29 2 views
6

SaxParser DefaultHandler 클래스를 확장 한 클래스를 만들었습니다. 제 의도는 원래 XML 데이터의 데이터 무결성을 유지하면서 일련의 객체에 XML 입력을 저장하는 것입니다. 테스트를하는 동안 노드 데이터 중 일부가 입력시 임의로 잘 렸습니다. 예를 들어문제 SaxParser를 사용하여 XML 문서 구문 분석 - 2047 자 제한?

:

Input: <temperature>-125</temperature> Output: <sensitivity>5</sensitivity> 
Input: <address>101_State</city>    Output: <address>te</address> 

더 일을 복잡하게하려면, 위의 오류는 같은 XML 태그의 모든 ~ 100 개 인스턴스에서 "무작위"1을 발생합니다. 즉, 입력 XML 파일에는 <temperature>-125</temperature>을 포함하는 약 100 개의 태그가 있지만 그 중 하나만 <sensitivity>5</sensitivity>의 출력을 생성합니다. 다른 태그는 정확하게 <sensitivity>-125</sensitivity>을 생성합니다.

public void characters(char[] ch, int start, int length) 
      throws SAXException { 

      value = new String(ch, start, length); 

      //debug 
      System.out.println("'" + value + "'" + "start: " + start + "length: " + length); 
     } 

내에 println 문은 다음과 같은 출력을 생성 :

나는 간단한 잡아 추상 "문자 (문자 [] 채널, INT 시작, INT 길이)"방법 XML 태그 사이의 문자 내용을 덮어왔다 오 출력 결과 특정 온도 태그 :

> '-12'start: 2045length: 3 '5'start: 
> 0length: 1 

이 문자 방법이 특정 XML 요소에 대해 두 번 호출되고 있음을 알려줍니다. 다른 모든 xml 태그에 대해 한 번 호출됩니다. secong 줄의 "start"값은 char [] 문자가이 XML 태그의 중간에 재설정되었음을 나타냅니다. 그리고 새로운 char []로 문자 메소드가 다시 호출됩니다.

이 문제에 익숙한 사람이 있습니까? 나는 내가 char []의 정원 한도에 도달했는지 궁금하게 생각하고 있었다. 그러나 빠른 쿼리를 통해 이럴 가능성이 없어졌습니다. 내 문자는 [] ~에 2047 문자

감사합니다,

LB

답변

8

characters callback method는 SAX 파서에 의해 데이터의 전체 덩어리 제공 할 필요를 재설정 할 것으로 보인다. 파서는 한 번에 데이터 덩어리를 보내어 characters() 메서드를 여러 번 호출 할 수 있습니다.

The resolution is to accumulate all the data in a buffer 다음 호출이 다른 메서드 (문자가 아닌 호출)에 발생할 때까지

+0

감사의 말 value = "";를 추가해야합니다. 이 제안이 맞은 것 같습니다. –

+0

정답. 고려해야 할 또 다른 가능성은 Stax 파서 (javax.xml.stream.XMLStreamReader)를 사용하고 "합체 모드 (coalescing mode)"를 사용하는 것입니다. 이는 수동으로 텍스트를 합칠 필요없이 SAX와 유사한 고성능을 제공합니다. – StaxMan

3

나는 해결책을 찾기 위해 하루 종일을 보냈다.

이에 문자 방법을 변경

:

public void characters(char[] ch, int start, int length) throws SAXException { 

    if(value == null) 
    value = new String(ch, start, length); 
    else 
    value += new String(ch, start, length); 

    //debug 
    System.out.println("'" + value + "'" + "start: " + start + "length: " + length); 

} 

그리고 그 일을!

0

당신이 endElementMethod

public void endElement(String uri, String localName, String qName) throws SAXException 
{ 
    ... 
    value = ""; 
}