2014-12-17 7 views
1

내가 자바 SAX 파서를 사용하고 그리고 난 어떤 경우 배열 채널에자바 SAX 파서 버그

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

를 오버라이드 (override)은 요소의 qname를 포함하지만 전체 값을 포함합니다.

예 :

ch = [... , x, s, d, :, n, a, m, e, >, 1, 2, 3] 

하지만 XSD의 실제 값 : 이름입니다 123456789

편집 원래 XML이 훨씬 더 크다 당연히 내가 (이 같은 XML이

String responseString = Utils.getXml(url); 

SAXParserFactory factory = SAXParserFactory.newInstance(); 
SAXParser saxParser = factory.newSAXParser(); 
handler = new SimpleHandler(); 
saxParser.parse(new InputSource(new StringReader(responseString)), handler); 

List<Entit> list = handler.getList(); 

)

<root> 
    <el> 
    <xsd:name>11111111</xsd:name> 
    </el> 
    <el> 
    <xsd:name>22222222</xsd:name> 
    </el> 
    <el> 
    <xsd:name>123456789</xsd:name> 
    </el> 
    <el> 
    <xsd:name>333333333</xsd:name> 
    </el> 
</root> 

xml의 한 값에 대해서만 오류가 발생합니다.

어떻게 해결할 수 있습니까?

+2

파서와 해당 XML 문서를 호출하는 코드를 제공 할 수 있습니까? – SirRichie

+0

전체적인 질문은 "** 요소의 값을 어떻게 얻을 수 있습니까? **"** ** "? –

+0

아니, 그렇게 생각하지 않아. 다른 xml 값을 얻을. 그래서 나는 이것이 자바 색소폰 파서의 버그라고 생각한다. – user3714967

답변

9

characters 방법은 반드시 문자의 전체 집합을 반환하지 않습니다. 당신은, 때마다 characters가 호출 결과를 저장하기 위해 같은 필요

final StringBuilder sb = new StringBuilder(); 

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

당신은 다음 재설정해야 당신의 StringBuilder 당신이 끝 요소 태그를 찾거나 요소 태그 또는 무엇이든을 시작할 때 (또는 당신이 사용하는 무엇이든) 그럴 수도 있습니다.

characters에 대한 사양을 읽어

"파서는 SAX 파서는 하나의 덩어리 연속하는 문자 데이터를 반환 할 수 있습니다, 각 문자 데이타 체크를보고하기 위해이 메소드를 호출하거나 여러으로 분할 할 수 있습니다. 하지만 단일 이벤트의 모든 문자는 동일한 외부 엔터티에서 가져와야하므로 로케이터가 유용한 정보를 제공합니다. "

일반적으로 startElement 또는 endElement이 표시되면 텍스트 버퍼를 삭제해야합니다. 일반적으로 현재 버퍼가 표시되면이를 수행합니다.