Отфильтровать символ \n из входного потока

Я пытаюсь разобрать 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, который продолжает поступать вот так?


person blessenm    schedule 05.10.2011    source источник
comment
проверьте также наличие символа \r, в зависимости от базовой ОС, на которой подготовлен исходный файл, может случиться так, что у вас есть \r\n вместо одного \r (как для Linux)   -  person Barmaley    schedule 05.10.2011


Ответы (1)


Проблема не в \n. Дело в том, что после первого тега </response> он считает, что документ завершен.

Эти данные не являются допустимым XML. Вы должны обернуть все внутри одного узла верхнего уровня. Кроме того, вы не можете иметь вторую декларацию <?xml version="1.0" encoding="UTF-8"?> в документе.

person Graham Borland    schedule 05.10.2011
comment
Я тоже об этом подумал. Дело в том, что xml продолжает поступать непрерывно в режиме реального времени, пока приложение не закроется. И я не уверен, смогу ли я добавить тег до ‹?xml version=1.0›. На самом деле мой синтаксический анализатор иногда работает, оборачивая входной поток в closeshieldinputstream из apache. Но я пытаюсь сделать это правильно. Другое дело, что я действительно не контролирую входящий xml. - person blessenm; 05.10.2011
comment
Я продолжал пытаться отфильтровать нежелательный тип документа в потоке, используя ReplaceFilterInputStream из Swizzle Stream. После этого парсер начинает получать все теги. Спасибо. - person blessenm; 08.10.2011