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

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
Eddie_Br0ck
Сообщения: 2
Зарегистрирован: 12 окт 2013, 23:50

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

Сообщение Eddie_Br0ck » 13 окт 2013, 00:01

Здравствуйте. Согласно заданию, необходимо написать парсер, который будет эммм... парсить(масло масленое) вот эту вот страницу http://www.cbr.ru/scripts/XML_News.asp
До первой русской буквы, т.е. И в слове Информация все вроде как идет неплохо, а дальше выкидывает со словами well-formed (invalid token). Я так понимаю, проблема в кодировке.
весь код парсера:

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;
}
}
}
}

Гуглил, менял кодировки в setInput, ставил null, windows-1251 и даже вот так HTTP.UTF-8, не знай, зачем правда. Помогите плз.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

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

Сообщение trew » 13 окт 2013, 19:56

Если скачать с сайта страницу в виде xml, а далее по уроку 79
http://startandroid.ru/ru/uroki/vse-uro ... m-xml.html
страница разбирается только при условии, если изменить строку
<?xml version="1.0" encoding="windows-1251"?>
на
<?xml version="1.0" encoding="utf-8"?>

Первый вариант решения "неправильный": загрузить страницу как текст, далее replace строки. А далее, по уроку 79.
Второй вариант, посмотреть ссылки:
http://habrahabr.ru/qa/11449/
http://androidforums.ru/topic/995-%D0%B ... %B2%D1%8B/

http://www.vogella.com/code/de.vogella. ... sFeed.html
// auto-detect the encoding from the stream
parser.setInput(new URL(rssFeed).openConnection().getInputStream(), null);
если не определится кодировка, может заменить на
parser.setInput(new URL(rssFeed).openConnection().getInputStream(), "windows-1251");

Как получиться, напишите здесь как сделали (готовый вариант).
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Eddie_Br0ck
Сообщения: 2
Зарегистрирован: 12 окт 2013, 23:50

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

Сообщение Eddie_Br0ck » 14 окт 2013, 14:59

А меня осенило: ведь наш encoding где-то считывается парсером? Я могу просто вместо того, чтобы считать, взять и указать ему сам руками, что utf-8. Это ведь решит проблему, если я правильно понимаю.

Ответить