1

このコードは Blackberry JDE v4.2.1 で実行されています。XML を返す Web API 呼び出しを行うメソッド内にあります。返される XML の形式が正しくない場合があり、解析する前に無効な文字を取り除く必要があります。

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

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

既存のコード:

handlerDefaultHandler
urlのオーバーライドです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());
}
4

2 に答える 2

2

ストリームはバイト指向であるため、InputStreamにストリッパーをアタッチすることは困難です。リーダーでそれを行う方が理にかなっているかもしれません。別のリーダーをラップしてエラーを処理する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);
    }
}

次に、ReaderからInputSourceを作成し、InputSourceを使用して解析を実行します。

于 2009-05-10T03:48:08.650 に答える
0

FilterInputStreamを使用します。FilterInputStream#readをオーバーライドして、問題のあるバイトをフィルタリングします。

于 2009-05-10T03:27:59.400 に答える