XMLPullParser чтение русских символов
Добавлено: 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, не знай, зачем правда. Помогите плз.
До первой русской буквы, т.е. И в слове Информация все вроде как идет неплохо, а дальше выкидывает со словами 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, не знай, зачем правда. Помогите плз.