Я пытаюсь разобрать xml из входного потока с помощью парсера sax. Входной поток постоянно получает входящий xml из сокета. '\n' используется как разделитель между данными xml. Вот как будет выглядеть xml
<?xml version="1.0" encoding="UTF-8"?>
<response processor="header" callback="comheader">
<properties>
<timezone>Asia%2FBeirut</timezone>
<rawoffset>7200000</rawoffset>
<to_date>1319256000000</to_date>
<dstrawoffset>10800000</dstrawoffset>
</properties>
</response>
\n
<event type="progress" time="1317788744214">
<param key="callback">todayactions</param>
<param key="percent">10</param>
<param key="msg">MAPPING</param>
</event>
<event type="progress" time="1317788744216">
<param key="callback">todayactions</param>
<param key="percent">20</param><param key="msg">MAPPING</param>
</event>
\n
<?xml version="1.0" encoding="UTF-8"?>
<response processor="header" callback="comheader">
<properties>
<timezone>Asia%2FBeirut</timezone>
<rawoffset>7200000</rawoffset>
<to_date>1319256000000</to_date>
<dstrawoffset>10800000</dstrawoffset>
</properties>
</response>
Это отлично сработало для нашего проекта iphone, так как мы взяли символы до \n, сохранили их в строке и использовали синтаксический анализатор dom.
Но когда я пытался сделать это для Android, строка не подходила, так как выдавала нам исключение OutOfMemory. Итак, мы устанавливаем входной поток непосредственно в SaxParser, он работает до символа \n, после чего он дает нам исключение
org.apache.harmony.xml.ExpatParser$ParseException: в строке 2 столбец 0: мусор после элемента документа
Поэтому я попытался отфильтровать входной поток, чтобы пропустить символ '\n'. Я создал FilterStreamReader, но мне это не удалось, похоже, моя функция чтения не выполняет свою работу. Вот мой код.
public class FilterStreamReader extends InputStreamReader {
public FilterStreamReader(InputStream in, String enc)
throws UnsupportedEncodingException {
super(in, enc);
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int read = super.read(cbuf, off, len);
Log.e("Reader",Character.toString((char)read));
if (read == -1) {
return -1;
}
int pos = off - 1;
for (int readPos = off; readPos < off + read; readPos++) {
if (read == '\n') {
pos++;
} else {
continue;
}
if (pos < readPos) {
cbuf[pos] = cbuf[readPos];
}
}
return pos - off + 1;
}
Может ли кто-нибудь помочь мне отфильтровать \n входного потока?
Редактировать Основываясь на том, что сказал Грэм, я смог проанализировать все данные, удалив все типы документов и добавив свои собственные начальный и конечный теги. Так что я не совсем уверен, что моя проблема заключается не только в фильтрации '\n'. Как вы можете разобрать xml, который продолжает поступать вот так?