Я пытаюсь проанализировать xml из входного потока с помощью синтаксического анализатора саксофона. Входящий поток непрерывно получает входящий 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.
Но когда я попытался сделать это для андроида, строка не была опцией, поскольку это дало нам исключение 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, который продолжает поступать так?