Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Eddie_Brock
0 / 0 / 0
Регистрация: 12.10.2013
Сообщений: 3
#1

XMLPullParser чтение русских символов - Программирование Android

12.10.2013, 23:23. Просмотров 1111. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос XMLPullParser чтение русских символов (Программирование Android):

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

Медленный XmlPullParser - Программирование Android
Всем привет! Собственно проблема всего лишь в скорости работы, по логам посмотрел что медленно грузит так это именно: ...

Самозакрывающийся тег XmlPullParser - Программирование Android
Здравствуйте уважаемые форумчане! Возникла проблемка: не могу спарсить самозакрывающийся тег: &lt;string/&gt; Когда парсер нактнется на...

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

RSS reader by XmlPullParser + Listview - Программирование Android
Написал программу для чтения RSS: https://github.com/PhantomRec/RSS Всё работает, но проблема в том, что показывает 5-7 тем, далее...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Salty_Sugar
26 / 26 / 1
Регистрация: 02.04.2012
Сообщений: 140
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
372 / 359 / 48
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2013, 15:45
Привет! Вот еще темы с ответами:

Чтение русских символов из файла - C#
Есть следующий код static public Edition Input() { using (StreamReader fileIn = new...

Чтение русских символов из файла - C++
Помогите пожалуйста с решением проблемы. Программа должна считывать символы из файла написанного заглавными русскими буквами и считать...

Чтение из файла русских символов - Java SE
Читаем из файла slo.txt с кодировкой ANSI строки, но появилась странность в том что после перезапуска программа считывает разные строки,...

Чтение из файла русских символов - Turbo Pascal
Помогите плиз)у меня прога должна ИЗ ТЕКСТОВОГО ФАЙЛА считывать русский текст производить определенные операции и вывести преобразованный...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.10.2013, 15:45
Ответ Создать тему
Опции темы

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