2011-10-05 7 views
1

sax 파서를 사용하여 입력 스트림에서 xml을 구문 분석하려고합니다. inputstream은 들어오는 xml을 소켓에서 연속적으로 가져옵니다. '\ n'은 xml 데이터 사이의 구분자로 사용됩니다. 이것은 XML 우리가 \ n을 개까지 문자를 가져다가 그 문자열에 저장하고, DOM 파서를 사용 이것은 우리의 아이폰 프로젝트를 위해 완벽하게 작동입력 스트림에서 n 문자를 필터링합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<response processor="header" callback="comheader"> 
    <properties> 
     <timezone>Asia%2FBeirut</timezone> 
     <rawoffset>7200000</rawoffset> 
     <to_date>1319256000000</to_date> 
     <dstrawoffset>10800000</dstrawoffset> 
    </properties> 
</response> 
\n 
<event type="progress" time="1317788744214"> 
    <param key="callback">todayactions</param> 
    <param key="percent">10</param> 
    <param key="msg">MAPPING</param> 
</event> 
<event type="progress" time="1317788744216"> 
    <param key="callback">todayactions</param> 
    <param key="percent">20</param><param key="msg">MAPPING</param> 
</event> 
\n 
<?xml version="1.0" encoding="UTF-8"?> 
<response processor="header" callback="comheader"> 
    <properties> 
     <timezone>Asia%2FBeirut</timezone> 
     <rawoffset>7200000</rawoffset> 
     <to_date>1319256000000</to_date> 
     <dstrawoffset>10800000</dstrawoffset> 
    </properties> 
</response> 

과 같을 것이다 방법이다.

하지만 안드로이드에 대해이 작업을 시도하면 문자열은 옵션이 아니며 OutOfMemory 예외가 발생했습니다. 그래서 우리는 그것이 우리에게 예외를 제공합니다 그 후, \ n을 문자 때까지 작동하는 SAXParser를 직접의 InputStream을 설정

org.apache.harmony.xml.ExpatParser $ ParseException가 : 2 호선, 열 0에서 : 문서 요소 후 정크

는 그래서 '\ n을'문자를 건너 뜁니다의 InputStream를 필터링하는 데 노력했다. FilterStreamReader를 만들었지 만 성공하지 못했습니다. 내 읽기 기능이 제대로 작동하지 않는 것 같습니다. 여기 내 코드가있다.

public class FilterStreamReader extends InputStreamReader { 
    public FilterStreamReader(InputStream in, String enc) 
      throws UnsupportedEncodingException { 
     super(in, enc); 
    } 

    @Override 
    public int read(char[] cbuf, int off, int len) throws IOException { 
     int read = super.read(cbuf, off, len); 
     Log.e("Reader",Character.toString((char)read)); 
     if (read == -1) { 
      return -1; 
     } 

     int pos = off - 1; 
     for (int readPos = off; readPos < off + read; readPos++) { 
      if (read == '\n') { 
       pos++; 
      } else {     
       continue; 
      } 
      if (pos < readPos) { 
       cbuf[pos] = cbuf[readPos]; 
      } 
     } 
     return pos - off + 1; 
} 

은 누군가가 나이되는 InputStream의 \ n을 필터링 도와 드릴까요? 그레이엄은 내가 모든 문서 유형을 제거하고 내 자신의 시작과 끝 태그를 추가하여 전체 데이터를 구문 분석 할 수 있었다 말씀을 바탕으로

편집 . 그래서 내 문제가 '\ n'만 필터링하지 않는다고 확신하지 못한다. 어떻게 이런 식으로 계속 XML을 파싱 할 수 있습니까?

+0

준비된 원본 파일이있는 기본 OS에 따라 \ r 기호가 있는지 확인하십시오. 단일 \ r 대신에 \ r \ n (Linux의 경우) – barmaley

답변

2

문제가 \n이 아닙니다. 첫 번째 </response> 태그 다음에 해당 문서가 완료되었다고 생각합니다.

이 데이터는 유효한 XML이 아닙니다. 단일 최상위 노드 안에 모든 것을 래핑해야합니다. 또한 문서를 통해 두 번째로 <?xml version="1.0" encoding="UTF-8"?> 선언을 할 수 없습니다.

+0

도 생각했습니다. 문제는 응용 프로그램이 닫힐 때까지 xml이 계속 실시간으로 계속 유지된다는 것입니다. 그리고 전에 태그를 추가 할 수 있는지 확실하지 않습니다. 실제로 아파서에서 closeshieldinputstream에 입력 스트림을 래핑하여 파서가 작동합니다. 그러나 그것을 올바른 방법으로하려고 노력하는 Im. 다른 것은 들어오는 xml에 대한 제어권을 가지고 있지 않다는 것입니다. – blessenm

+0

Swizzle Stream의 ReplaceFilterInputStream을 사용하여 스트림에서 원하지 않는 doctype을 필터링하려고했습니다. 그런 다음 파서가 모든 태그를 가져 오기 시작합니다. 감사. – blessenm

관련 문제