2009-05-10 5 views
1

このコードは、Blackberry JDE v4.2.1で実行されています。これはXMLを返すWeb API呼び出しを行うメソッドです。時々、返されたXMLは整形式ではないので、解析する前に無効な文字を取り除く必要があります。J2MEのストリームから無効なXML文字を取り除く方法はありますか? org.xml.sax.SAXParseException:無効な文字

現在、私は得る:org.xml.sax.SAXParseException: Invalid character '' encountered

無効な文字ストリッパーを入力ストリームに添付して、ストリームがバリデーター/ストリッパーと解析呼び出しの間を流れるようにするアイデアを見たいと思います。つまり、ストリームのコンテンツを保存しないようにしようとしています。

既存のコード:

ハンドラはAPI URL

hconn = (HttpConnection) Connector.open(url,Connector.READ_WRITE,true); 

... 

try{ 
    XMLParser parser = new XMLParser(); 
    InputStream input = hconn.openInputStream(); 
    parser.parse(input, handler); 
    input.close(); 
} catch (SAXException e) { 
    Logger.getInstance().error("getViaHTTP() - SAXException - "+e.toString()); 
} 

答えて

2

ストリームはバイト指向であるため、InputStreamにストリッパーを取り付けることは困難です。 Readerでそれを行う方が意味があるかもしれません。別のリーダーをラップし、エラーを処理するStripReaderのようなものを作ることができます。以下は、このためのコンセプトを迅速に、テストされていない、証拠です:

public class StripReader extends Reader 
{ 
    private Reader in; 
    public StripReader(Reader in) 
    { 
    this.in = in; 
    } 

    public boolean markSupported() 
    { 
    return false; 
    } 

    public void mark(int readLimit) 
    { 
    throw new UnsupportedOperationException("Mark not supported"); 
    } 

    public void reset() 
    { 
    throw new UnsupportedOperationException("Reset not supported"); 
    } 

    public int read() throws IOException 
    { 
    int next; 
    do 
    { 
     next = in.read(); 
    } while(!(next == -1 || Character.isValidCodePoint(next))); 

    return next; 
    } 

    public void close() throws IOException 
    { 
    in.close(); 
    } 

    public int read(char[] cbuf, int off, int len) throws IOException 
    { 
    int i, next = 0; 
    for(i = 0; i < len; i++) 
    { 
     next = read(); 
     if(next == -1) 
     break; 
     cbuf[off + i] = (char)next; 
    } 
    if(i == 0 && next == -1) 
     return -1; 
    else 
     return i; 
    } 

    public int read(char[] cbuf) throws IOException 
    { 
    return read(cbuf, 0, cbuf.length); 
    } 
} 

あなたはその後、リーダー、その後からInputSourceを構築するだろう、その後のInputSourceを使用して解析を行います。

+0

Blackberryは明らかにFilterReaderも持っていないので、私はこれを使用しないように修正しました。 –

+0

RIMにCharacter.isValidCodePoint()も含まれていません 私は自分自身をロールバックしなければなりませんでした。しかし、この方法はうまくいくように見えます - シミュレータでは少なくとも。うまくいけば、それはまた、実際のデバイスでは遅すぎることもありません。ありがとう! –

+0

ようこそ。ちょうどよくテストするようにしてください。すべてのキャラクターが(再)チェックされなければならないので、不可避的に遅くなるでしょう。しかし、私は不必要なコピーをしているとは思わない。 P.S. isValidCodePointの実装方法が不思議です。 –

0

使用FilterInputStreamを含むString DefaultHandler
URLのオーバーライドされています。問題のあるバイトをフィルタリングするには、FilterInputStream#readを上書きします。

+0

ストリームに文字デコードロジックを複製する必要があるという問題があります。 –

+1

XMLParserをカスタマイズしなければ、それを避ける方法はないでしょうか? –

+0

RIMにFilterInputStreamがありませんhttp://www.blackberry.com/developers/docs/4.2.1api/index.html –

関連する問題