Урок 79. XmlPullParser. Парсим XML

Обсуждение уроков
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение rezak90 » 04 сен 2012, 21:02

скорее всего неправильный импорт R файла ресурсов, не то импортировал. Так что проверь импорт.
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение AndreyI » 05 сен 2012, 08:29

algebra писал(а):в папке layout а не layouts находится файл activity_main.xml и такой же в папке menu
Ну так и пишите
setContentView(R.layout.activity_main);

arreke
Сообщения: 7
Зарегистрирован: 09 окт 2012, 13:51

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение arreke » 09 окт 2012, 14:42

Подскажите, как можно вытащить XmlPullParser xpp = prepareXpp(); наружу, как глобальную переменную? Чтобы один раз создать xpp, а потом на неё ссылать из разных функций, а то я в каждой функуции создаю локальную xpp, а как сделать одну глобальную не знаю.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение rezak90 » 09 окт 2012, 14:46

arreke писал(а):Подскажите, как можно вытащить XmlPullParser xpp = prepareXpp(); наружу, как глобальную переменную? Чтобы один раз создать xpp, а потом на неё ссылать из разных функций, а то я в каждой функуции создаю локальную xpp, а как сделать одну глобальную не знаю.
public static XmlPullParser xpp
Только это не есть хоросо, противоречит правилам ООП.
R.id.team
Политика на форуме запрещена

arreke
Сообщения: 7
Зарегистрирован: 09 окт 2012, 13:51

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение arreke » 09 окт 2012, 16:08

rezak90 писал(а): public static XmlPullParser xpp
Только это не есть хоросо, противоречит правилам ООП.
у меня ошибку показывает когда так делаю.
а как правильно надо делать? в каждой функции создавать локальный xpp?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение rezak90 » 09 окт 2012, 16:19

в каждой активити а не "функции" следует создавать, или же передавать между активити. Просто если делать все переменные "глобальными" то зачем тогда private и parcelable вообще)))
R.id.team
Политика на форуме запрещена

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение elron » 26 ноя 2012, 20:30

Ну, прочитать его можно. А какие варианты есть чтоб изменить его и сохранить потом в файл ? И ещё: если открывать из ресурса, то этот ресурс(prefs.xml) изменить нельзя или такое возможно ?!

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение AndreyI » 26 ноя 2012, 21:57

Ресурсы прложения (папка res), также как и манифест, библиотеки классов находящиеся в пакете apk изменить после установки пакета уже нельзя. Вы только можете скопировать их содержимое в другое место и уже там изменять.

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение elron » 01 дек 2012, 20:49

AndreyI писал(а):Ресурсы прложения (папка res), также как и манифест, библиотеки классов находящиеся в пакете apk изменить после установки пакета уже нельзя. Вы только можете скопировать их содержимое в другое место и уже там изменять.
Ясно)) с таким способом можно только использовать как статическую БД. А как всётаки редактировать такой файл ?

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение AndreyI » 02 дек 2012, 02:30

elron писал(а): А как всётаки редактировать такой файл ?
AndreyI писал(а): Вы только можете скопировать их содержимое в другое место и уже там изменять.
apk ко всему прочему, еще и подписан электронной подписью, даже если вы каким-то образом и измените инсталлированный пакет, то работать он уже не будет.

Steve Ray
Сообщения: 2
Зарегистрирован: 02 фев 2013, 18:55

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение Steve Ray » 02 фев 2013, 19:00

Можно как-нибудь открыть xml файл не лежащий в папке res/xml, как показано в уроке

Код: Выделить всё

getResources().getXml(R.xml.data);
?
Например, я загрузил файл xml из интернета, сохранил его в кэш-папке. Если нельзя, то подскажите как лучше обойти эту проблему.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение rezak90 » 02 фев 2013, 19:42

так вытягивайте как обычный файл с системы File file = new File("your_temp_dir/file.xml");
R.id.team
Политика на форуме запрещена

Steve Ray
Сообщения: 2
Зарегистрирован: 02 фев 2013, 18:55

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение Steve Ray » 02 фев 2013, 20:23

rezak90 писал(а):так вытягивайте как обычный файл с системы File file = new File("your_temp_dir/file.xml");
Отлично, а с помощью чего его передать, не так же

Код: Выделить всё

XmlPullParser xpp = file
подскажите, я не совсем понимаю.

UPD:

Нашёл как решить, может кому пригодится.

Код: Выделить всё

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
File file = new File(Environment.getExternalStorageDirectory()+ "/new.xml");
FileInputStream fis = new FileInputStream(file);
parser.setInput(new InputStreamReader(fis));

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение rezak90 » 02 фев 2013, 23:23

ну так а я о чём говорил, читаем файл, читаем стрим, стрим в парсер
R.id.team
Политика на форуме запрещена

Аватара пользователя
WOLVERINE
Сообщения: 8
Зарегистрирован: 28 ноя 2012, 15:13
Откуда: Минск
Контактная информация:

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение WOLVERINE » 15 фев 2013, 11:35

не актуально, разобрался сам

tytryn
Сообщения: 7
Зарегистрирован: 23 мар 2013, 15:01

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение tytryn » 23 мар 2013, 15:19

Здравствуйте.
Есть такая задача, вроде простая, но у меня пока не получается. Необходимо прочесть xml файл следующего вида:

<data>
<phone>
<id>1</id>
<company>Samsung</company>
<model>Galaxy</model>
<price>18000</price>
</phone>
<phone>
<id>2</id>
<company>htc</company>
<model>desire</model>
<price>18000</price>
</phone>
</data>

и вывести на экран только один элемент сравнивая поле id с уже существующей переменной.

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение dens » 24 мар 2013, 15:43

Здравствуйте.
Есть такая задача, вроде простая, но у меня пока не получается. Необходимо прочесть xml файл следующего вида:

<data>
<phone>
<id>1</id>
<company>Samsung</company>
<model>Galaxy</model>
<price>18000</price>
</phone>
<phone>
<id>2</id>
<company>htc</company>
<model>desire</model>
<price>18000</price>
</phone>
</data>

и вывести на экран только один элемент сравнивая поле id с уже существующей переменной.
Я бы сделал как-то так:

Код: Выделить всё

String xmlString = "<data>" +
							"<phone><id>1</id><company>Samsung</company><model>Galaxy</model><price>18000</price></phone>" +
							"<phone><id>2</id><company>htc</company><model>desire</model><price>18000</price></phone>" +
							"</data>";
		HashMap<String, String> deviceInfo = new HashMap<String, String>();
		
		try {
		    XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
		    xmlPullParserFactory.setNamespaceAware(true);
		    XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
		    xmlPullParser.setInput(new StringReader(xmlString));
		    
		    int currentDeviceId = 0;
		    int needDeviceId = 2; 
		    String tagName = "";
		    
		    boolean exit = false;
		    while (xmlPullParser.getEventType() != XmlPullParser.END_DOCUMENT && !exit) {
		    	switch (xmlPullParser.getEventType()) {
		        	// начало тега
		        	case XmlPullParser.START_TAG:
		        		if (xmlPullParser.getName().equals("id")) {
		        			tagName = "id";
		          		} else if (xmlPullParser.getName().equals("company")) {
		          			tagName = "company";
		          		} else if (xmlPullParser.getName().equals("model")) {
		          			tagName = "model";
		          		} else if (xmlPullParser.getName().equals("price")) {
		          			tagName = "price";
		          		}
		          		break;
		          	// конец тега
		        	case XmlPullParser.END_TAG:
		        		if (xmlPullParser.getName().equals("id") ||
		        			xmlPullParser.getName().equals("company") ||
		        		    xmlPullParser.getName().equals("model") ||
		        			xmlPullParser.getName().equals("price")) {
		        			tagName = "";
		          		} else if (xmlPullParser.getName().equals("phone") && currentDeviceId == needDeviceId) {
		          			exit = true;
		          		}
		          		break;
		          	// содержимое тега
		        	case XmlPullParser.TEXT:
		        		if (tagName.length() > 0) {
		        			if (tagName.equals("id")) {
			        			currentDeviceId = Integer.parseInt(xmlPullParser.getText());
			        		} else if (currentDeviceId == needDeviceId) {
			        			if (tagName.equals("company") ||
			        				tagName.equals("model") ||
			        				tagName.equals("price")) {
			        				deviceInfo.put(tagName, xmlPullParser.getText());
				        		}
			        		}
		        		}
		        		break;
		        	default:
		        		break;
		        }

		    	xmlPullParser.next();
		    }
		} catch (IOException e) {
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		}
Потом данные их deviceInfo можешь куда угодно выводить. Ну либо сразу записывать во вьюхи, как удобно.

tytryn
Сообщения: 7
Зарегистрирован: 23 мар 2013, 15:01

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение tytryn » 25 мар 2013, 12:35

Спасибо помогло, все работает.

rjlexx
Сообщения: 7
Зарегистрирован: 20 мар 2013, 22:30

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение rjlexx » 26 мар 2013, 14:07

А вам не кажется, что обработка xml через XmlPullParser выглядит как-то примитивно?
Мне вот кажется более удобным использование DocumentBuilder.parse(). Он возвращает объект типа Document. И в нем есть все необходимые для работы с xml методы. Ими намного удобнее пользоваться, чем парсить xml практически вручную.
Вот отрывок кода для примера:

Код: Выделить всё

String wetherUrl = "http://xml.weather.co.ua/1.2/forecast/773";
URL url = new URL(wetherUrl);
        	
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(url.openStream());

Element currentWether = (Element)doc.getElementsByTagName("current").item(0);
String currentTemper = currentWether.getElementsByTagName("t").item(0).getTextContent();
			
NodeList dayForecasts = doc.getElementsByTagName("day");

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 79. XmlPullParser. Парсим XML

Сообщение rezak90 » 26 мар 2013, 16:34

если большой объём xml файла то лучше использовать sax парсер чем dom, так как sax работает быстрее
R.id.team
Политика на форуме запрещена

Ответить