Фильтровать \ n символ из inputtream - PullRequest
1 голос
/ 05 октября 2011

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

1 Ответ

2 голосов
/ 05 октября 2011

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

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

...