此代码在Blackberry JDE v4.2.1上运行。它是一种使Web 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());
}
答案 0 :(得分: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);
}
}
然后,您将从Reader构造一个InputSource,然后使用InputSource进行解析。
答案 1 :(得分:0)
使用FilterInputStream。覆盖FilterInputStream#read以过滤有问题的字节。