Как я должен удалить недопустимые символы XML из потока в J2ME? org.xml.sax.SAXParseException: недопустимый символ
Этот код выполняется в 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 ответа
К 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.
Используйте FilterInputStream. Переопределить FilterInputStream#read для фильтрации ошибочных байтов.