2013-02-13 3 views
1

문서를 파싱하려고합니다. InkML. 모든 컨텐트의 노드에는 6 또는 7 숫자 (음수 및 소수)가 포함 된 더 많은 튜플 (쉼표로 구분)이 있습니다.Sax 파서가 전적으로 라인을 읽지 않습니다.

테스트에서 SAX의 문자은 모든 데이터를 기억하지 않습니다.

코드 :

public class PenParser extends DefaultHandler { 

    //code useless 

public void characters(char ch[], int start, int length) throws SAXException { 
//begin my debug print 
     StringBuilder buffer=new StringBuilder(); 
     for(int i=start;i<length;i++){ 
      buffer.append(ch[i]); 
     } 
     System.out.println(">"+buffer); 
//end my debug print 

디버그, 난 버퍼이 관심 태그의 모든 수를 포함하지 않는 것을 볼 수 있지만, 그것은 첫 번째 107 (다소) 문자를 포함 (내 행은 4610 자 이상이 아닙니다.) 문자에 의해 StringBufferSAX 구문 분석이 이상하다고 생각합니다.

저는 StringBuilder도 사용했지만 문제는 남아 있습니다.

아무 것도 제안하지 않습니까?

+0

을 컷은 무작위입니다 : 때로는 발생하지 않습니다. 언젠가는 107 char 이후에 언젠가 발생합니다. 3000 char 이후에 언젠가 발생합니다 : 행의 길이는 정적으로 정의되지 않습니다. – alepuzio

답변

9

예 - 꽤 분명합니다. 한 노드가 구문 분석 될 때 문자가 여러 번 호출 될 수 있습니다.

회원으로 StringBuilder을 사용해야하고 콘텐츠를 문자로 추가하고 내용을 endElement으로 처리해야합니다.

은 BTW

을 편집했다. 당신은 문자로 버퍼 문자를 구축 할 필요가 없습니다 - 이 (내가 항상 사용) 문자의 내 구현

@Override 
    public void characters(char[] ch, int start, int length) throws SAXException 
    { 
     characters.append(new String(ch,start,length)); 
    } 

입니다 ...하지 잊지하기에 ....

@Override 
    public void endElement(String uri, String localName, String qName) 
      throws SAXException 
    { 
        final String content = characters.toString().trim(); 
        // .... deal with content 
        // reset characters 
     characters.setLength(0); 
    } 

private final StringBuilder characters = new StringBuilder(64); 
+0

characters.append (새 문자열 (ch, start, length)); 저를 저장했습니다 – alepuzio

+1

내용의 서브 컨텐츠 morecontent에있는 서브 컨텐츠와 같이 setLength (0)을 호출하면 작동하지 않습니다. – rogerdpack

+1

아니,이 쉬운 해결책은 그 때 작동하지 않을 것입니다. 어쨌든 다른 전략이 필요할 것이라고 생각합니다. 하위 컨텐츠없이 컨텐츠와 컨텐츠를 합치는 것이별로 의미가 없을 것입니다. OK - 솔루션은 startElement와 endElement에서 호출되는 다른 메서드의 내용을 처리 할 수 ​​있습니다. 그래서 - 인터리빙 된 콘텐츠가있는 XML 구조를 정의하지 않기 때문에이 솔루션이 저에게 효과적입니다. –