2010-04-04 5 views
1

SAX 구문 분석기를 사용할 때 "노드 내용에"이 있으면 구문 분석이 실패합니다. 어떻게 해결할 수 있습니까? 모든 "문자를 변환 하시겠습니까? 핸들러가 구문 분석 할 때 그 노드가 여러 문자 배열로 도살됩니다Android API 1.5의 SAX 파서 (javax.xml.parsers.SAXParser)로 따옴표를 구문 분석하는 데 문제가 있습니다.

<node>characters in node containing "quotes"</node> 

:

즉, 언제 내가 노드에서 인용문이. 이것은 정상적인 행동입니까? 따옴표로 인해 문제가 발생하는 이유는 무엇입니까?

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 

... 


HttpGet httpget = new HttpGet(GATEWAY_URL + "/"+ question.getId()); 
      httpget.setHeader("User-Agent", PayloadService.userAgent); 
      httpget.setHeader("Content-Type", "application/xml"); 

      HttpResponse response = PayloadService.getHttpclient().execute(httpget); 
      HttpEntity entity = response.getEntity(); 

      if(entity != null) 
      {   
       SAXParserFactory spf = SAXParserFactory.newInstance(); 
       SAXParser sp = spf.newSAXParser();    
       XMLReader xr = sp.getXMLReader();    

       ConvoHandler convoHandler = new ConvoHandler(); 
       xr.setContentHandler(convoHandler);    
       xr.parse(new InputSource(entity.getContent()));         


       entity.consumeContent();   

       messageList = convoHandler.getMessageList(); 


      } 
+0

모든 조합에서 "sax"및 "parser"태그를 반복하는 대신 어떤 언어, 플랫폼 및 특정 파서를 말하면 어떻습니까? – skaffman

+0

원래이 질문을 게시 할 때 서둘러서 죄송합니다. 그 후 메서드 및 메서드에 전달 된 문자 배열을 가져 오는 처리기 코드를 빼고 코드와 플랫폼을 사용하여 업데이트했습니다. public void characters (char ch [], int start, int length) { .. . else if (in_text) { \t \t \t \t message.setText (new String (ch, start, length)); \t \t \t} 인용 함유 노드의 경우 \t ... } 는 문자 배열이 잘못 동일한 노드에 대한 복수의 문자 배열로 잘게된다. – JohnRock

답변

6

오류가 가장 최근의 코멘트에서 참조 핸들러 클래스에 : 여기

내가 사용하고있는 코드입니다.

ContentHandler 작성시 자주 발생하는 오류는 문자 메소드가 모든 문자 데이터와 함께 한 번만 호출된다고 가정하는 것입니다. 실제로 수집해야하는 문자 데이터 덩어리로 여러 번 호출 될 수 있습니다. 여러 문자 배열을 작성하는 것은 정상적인 동작입니다.

아마 startElement 메소드에서 콜렉터 (아마도 StringBuffer)를 시작하고 문자 메소드에서 데이터를 수집 한 다음 endElement 메소드의 데이터를 사용해야합니다. 여기에있는 message.setText는 주석이 호출됩니다.

+0

고맙습니다. 나는 이것을 인식하지 못했다. 나는 필자의 코드를 그에 따라 리펙토링 할 것이다. 언제 수집해야하는지에 대한 규칙이 있는지 알고 있습니까? 이것은 모든 텍스트 필드에 대해 수행되어야하지만 boolen 또는 숫자 값에는 적용되지 않아야하는 것처럼 들립니다. 사실입니까? 또는 모든 노드에 대해 수집기를 사용해야합니까? – JohnRock

+1

XML에서는 실제로는 모든 텍스트입니다 (적어도 SAX 구문 분석의 관점에서). 부울 및 숫자를 나타내는 데이터의 경우 크기가 작고 내용의 변형이 많지 않으므로 여러 청크로 분할 될 가능성은 적지 만 이론적으로는 분할 될 수 있습니다. –

1

정답은 이미 제공되었습니다 (문자 데이터가 단일 이벤트로 전송되는 것을 보장하지 않음). 고려해야 할 한가지는 아마도 Stax (또는 xmlpull) "파서"인터페이스가있는 파서를 사용하면 더 잘 작동한다는 것입니다. Stax 파서가 모든 문자 데이터가 단일 토큰으로보고되도록 강제하는 방법이 있습니다 (병합 사용 가능). Stax (또는 일반적으로 파서를 당기는 것)는 SAX보다 조금 더 편리하다고 생각되며 Android에서도 실행되는 구현이 있습니다 (안드로이드 SDK도 xmlpull을 번들로 포함한다고 생각합니다). Woodstox와 Aalto가 효과가 있습니다.

관련 문제