Como devo remover caracteres XML inválidos de um córrego em J2ME? org.xml.sax.SAXParseException: caractere inválido

votos
1

Este código é executado no BlackBerry JDE v4.2.1 É em um método que faz chamadas web API que retornam XML. Às vezes, o XML retornado não está bem formado e eu preciso retirar quaisquer caracteres inválidos antes de analisar.

Atualmente, eu recebo: org.xml.sax.SAXParseException: Invalid character '' encountered.

Eu gostaria de ver idéias de uma maneira rápida para anexar uma stripper de carácter inválido no fluxo de entrada para que o fluxo flui através do validador / stripper e para a chamada de análise. ou seja, eu estou tentando evitar salvar o conteúdo do fluxo.

Existente código:

manipulador é uma substituição de DefaultHandler
url é uma String contendo o APIURL

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());
}
Publicado 10/05/2009 em 04:03
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

É difícil atribuir uma stripper no InputStream porque fluxos são orientados para byte. Pode fazer mais sentido fazê-lo em um leitor . Você poderia fazer algo como um StripReader que envolve um outro leitor e lida com erros. Abaixo está um rápido, não testada, prova de conceito para isso:

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);
    }
}

Você, então, construir um InputSource a partir de então Leitor seguida, fazer a análise usando o InputSource.

Respondeu 10/05/2009 em 04:48
fonte usuário

votos
0

Use um FilterInputStream . Substituir FilterInputStream # ler para filtrar os bytes de ofensa.

Respondeu 10/05/2009 em 04:27
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more