Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Eddie_Brock
0 / 0 / 0
Регистрация: 12.10.2013
Сообщений: 3
1

XMLPullParser чтение русских символов

12.10.2013, 23:23. Просмотров 1232. Ответов 4
Метки нет (Все метки)

Здравствуйте. Согласно заданию, необходимо написать парсер, который будет эммм... парсить(масло масленое) вот эту вот страницу http://www.cbr.ru/scripts/XML_News.asp
До первой русской буквы, т.е. И в слове Информация все вроде как идет неплохо, а дальше выкидывает со словами well-formed (invalid token). Я так понимаю, проблема в кодировке. Вот собственно парсер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public List<HashMap<String, String>> MyParse(InputStream iStream) 
            throws XmlPullParserException, IOException{
        try{
            XmlPullParser MParser = Xml.newPullParser();
            MParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            MParser.setInput(iStream, "UTF-8");
            MParser.nextTag();
//            Log.d("Parser", MParser.toString());
            return BeginParsingNews(MParser);
        }
        finally{
            iStream.close();
        }
    }
Вот так непосредственно текст читается, после определения конкретного тега вызывается функция readText:
Java
1
2
3
4
5
6
7
8
9
10
private String readText(XmlPullParser MParser) 
            throws IOException, XmlPullParserException {
        // TODO Auto-generated method stub
        String result = "";
        if(MParser.next() == XmlPullParser.TEXT) {
            result = MParser.getText();
            MParser.nextTag();
        }
        return result;
    }
Гуглил, менял кодировки в setInput, ставил null, windows-1251 и даже вот так HTTP.UTF-8, не знай, зачем правда. Это моя 2я прога в Android, да и вообще опыта программирования не то чтобы много. На форуме к слову в первый раз спрашиваю, так что камнями не закидывайте плз, если что-то не так спросил или оформил. Прогу сдавать уже скоро, поэтому времени, чтобы еще 2-3 дня сидеть гуглить, у меня нет.

Добавлено через 5 минут
На всякий случай скину весь код парсера:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package com.example.myfuck;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.io.InputStream;
import org.apache.http.protocol.HTTP;
 
import android.util.Log;
import android.util.Xml;
 
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
 
public class MyParser {
    
    private static final String fStr = null;
    
    public List<HashMap<String, String>> MyParse(InputStream iStream) 
            throws XmlPullParserException, IOException{
        try{
            XmlPullParser MParser = Xml.newPullParser();
            MParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            MParser.setInput(iStream, "UTF-8");
            MParser.nextTag();
//            Log.d("Parser", MParser.toString());
            return BeginParsingNews(MParser);
        }
        finally{
            iStream.close();
        }
    }
    
    private List<HashMap<String, String>> BeginParsingNews(
            XmlPullParser MParser) throws IOException, XmlPullParserException {
        // TODO Auto-generated method stub
        List<HashMap<String, String>> MyList = new ArrayList<HashMap<String,String>>();
        
        MParser.require(XmlPullParser.START_TAG, fStr, "News");
        
        while(MParser.next() != XmlPullParser.END_TAG) {
            if(MParser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String name = MParser.getName();
            if(name.equals("Item")){
                MyList.add(readItem(MParser));
            }
            else{
                skip(MParser);
            }
        }
        return MyList;
    }
    
    private HashMap<String, String> readItem(XmlPullParser MParser) 
            throws IOException, XmlPullParserException {
        // TODO Auto-generated method stub
        MParser.require(XmlPullParser.START_TAG, fStr, "Item");
        
        String dateItem = "";
        String urlItem = "";
        String titleItem = "";
        
        while (MParser.next() != XmlPullParser.END_TAG) {
            if(MParser.getEventType() != XmlPullParser.START_TAG){
                continue;
            }
            
            String name = MParser.getName();
            
            if(name.equals("Date")) {
                dateItem = readDate(MParser);
            } else if (name.equals("Url")) {
                urlItem = readUrl(MParser);
            } else if (name.equals("Title")) {
                titleItem = readTitle(MParser);
            } else {
                skip(MParser);
            }
        }
        
        String data = "Url: " + urlItem + "\n" +
                      "Title: " + titleItem;
        
        HashMap<String, String> hMap = new HashMap<String, String>();
        hMap.put("Date", dateItem);
        hMap.put("Data", data);
        
        return hMap;
    }
    
    private String readDate(XmlPullParser MParser) 
            throws XmlPullParserException, IOException {
        // TODO Auto-generated method stub
        MParser.require(XmlPullParser.START_TAG, fStr, "Date");
        String date = readText(MParser);
        MParser.require(XmlPullParser.END_TAG, fStr, "Date");
        return date;
    }
    
    private String readUrl(XmlPullParser MParser) 
            throws XmlPullParserException, IOException {
        // TODO Auto-generated method stub
        MParser.require(XmlPullParser.START_TAG, fStr, "Url");
        String url = readText(MParser);
        MParser.require(XmlPullParser.END_TAG, fStr, "Url");
        return url;
    }
    
    private String readTitle(XmlPullParser MParser) 
            throws XmlPullParserException, IOException {
        // TODO Auto-generated method stub
        MParser.require(XmlPullParser.START_TAG, fStr, "Title");
        String title = readText(MParser);
        MParser.require(XmlPullParser.END_TAG, fStr, "Title");
        return title;
    }
    
    private String readText(XmlPullParser MParser) 
            throws IOException, XmlPullParserException {
        // TODO Auto-generated method stub
        String result = "";
        if(MParser.next() == XmlPullParser.TEXT) {
            result = MParser.getText();
            MParser.nextTag();
        }
        return result;
    }
    
    private void skip(XmlPullParser MyParsing) 
            throws XmlPullParserException, IOException {
        // TODO Auto-generated method stub
        if(MyParsing.getEventType() != XmlPullParser.START_TAG) {
            throw new IllegalStateException();
        }
        int depth = 1;
        while (depth != 0) {
            switch (MyParsing.next()) {
            case XmlPullParser.END_TAG:
                depth--;
                break;
            case XmlPullParser.START_TAG:
                depth++;
                break;
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2013, 23:23
Ответы с готовыми решениями:

Чтение русских символов. Отрицательные значения у символов
Добрый вечер. Считую файл .txt. Но русские буквы получают отрицательное...

Медленный XmlPullParser
Всем привет! Собственно проблема всего лишь в скорости работы, по логам...

Изменения в XmlPullParser
Сегодня в почте увидел письмо от Гугла, что следует перейти на новую версию...

Самозакрывающийся тег XmlPullParser
Здравствуйте уважаемые форумчане! Возникла проблемка: не могу спарсить...

XmlPullParser неправильно получает значения
Здравствуйте. Пытаюсь написать обработку XML сообщения от сервера, получить...

4
Salty_Sugar
26 / 26 / 4
Регистрация: 02.04.2012
Сообщений: 142
13.10.2013, 15:54 2
Вот что то нагуглил
С сервера xml приходит в какой кодировке?
Если utf-8 то попробуйте result = EntityUtils.toString(httpEntity, "UTF-8");
0
Eddie_Brock
0 / 0 / 0
Регистрация: 12.10.2013
Сообщений: 3
13.10.2013, 17:16  [ТС] 3
да у меня совсем иначе чтение происходит, но спасибо за отклик.
0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
14.10.2013, 01:45 4
А ISO-8859-1 вы не пробовали ?
Java
1
2
parser.setInput(is, "ISO-8859-1");
String str = new String(parser.nextText().getBytes("ISO-8859-1"), "Windows-1251");
0
Eddie_Brock
0 / 0 / 0
Регистрация: 12.10.2013
Сообщений: 3
14.10.2013, 15:45  [ТС] 5
с ISO-8859-1 парсер, как я понял, не может EndTag найти из каких-то соображений.
0
14.10.2013, 15:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2013, 15:45

XmlPullParser - проверка существования атрибута
Добрый день. Возникла необходимость проверять наличие в xml файле какого-либо...

RSS reader by XmlPullParser + Listview
Написал программу для чтения RSS: https://github.com/PhantomRec/RSS Всё...

wifstream чтение русских символов
wifstream *fl = new wifstream(&quot;D:\\my.txt&quot;); while (!fl-&gt;eof()) { y +=...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru