Как я должен удалить недопустимые символы XML из потока в J2ME? org.xml.sax.SAXParseException: недопустимый символ - PullRequest
1 голос
/ 10 мая 2009

Этот код выполняется в Blackberry JDE v4.2.1. Он находится в методе, который выполняет вызовы веб-API, которые возвращают XML. Иногда возвращаемый XML не является правильно сформированным, и мне нужно удалить любые недопустимые символы перед анализом.

В настоящее время я получаю: org.xml.sax.SAXParseException: Invalid character '' encountered.

Я хотел бы увидеть идеи быстрого способа присоединения недопустимого стриппера символов к входному потоку, чтобы поток просто проходил через валидатор / стриппер и в вызов синтаксического анализа. я пытаюсь избежать сохранения содержимого потока.

Существующий код:

обработчик является переопределением DefaultHandler
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());
}

Ответы [ 2 ]

2 голосов
/ 10 мая 2009

Трудно прикрепить стриппер к 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 из этого Reader, а затем выполнить анализ с использованием InputSource.

0 голосов
/ 10 мая 2009

Использовать FilterInputStream . Переопределите FilterInputStream # read для фильтрации поврежденных байтов.

...