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

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

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

Сообщение tytryn » 10 май 2013, 11:16

Подскажите пожалуйста, как вместо этой строчки:

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

xpp.setInput(new StringReader(
        "<data><phone><company>Samsung</company></phone></data>"));
    return xpp;
передать парсеру файл из интернета?

например "http://sait.com/file.xml".

ivan160892
Сообщения: 3
Зарегистрирован: 26 май 2013, 13:58

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

Сообщение ivan160892 » 26 май 2013, 14:09

Наверно как то так:
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost( url );
HttpResponse response = httpclient.execute( httppost );
in = new BufferedReader ( new InputStreamReader(response.getEntity().getContent (),"utf-8"));
String inputLine = "";
StringBuilder websiteContent = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
websiteContent.append(inputLine);
websiteContent.append('\n');
}
String websiteContentFull = websiteContent.toString();
XmlPullParser prepareXpp() throws XmlPullParserException {
// получаем фабрику
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// включаем поддержку namespace (по умолчанию выключена)
factory.setNamespaceAware(true);
// создаем парсер
XmlPullParser xpp = factory.newPullParser();
// даем парсеру на вход Reader
xpp.setInput(new StringReader(websiteContentFull));

ivan160892
Сообщения: 3
Зарегистрирован: 26 май 2013, 13:58

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

Сообщение ivan160892 » 26 май 2013, 14:11

Подскажите пожалуйста.
Делаю все как по уроку в логах печатает вроде все как в моем файле. А записать значение( вроде такого str = xpp.getText().toString()) не получается.

Natalia
Сообщения: 15
Зарегистрирован: 03 ноя 2012, 17:09

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

Сообщение Natalia » 08 июн 2013, 22:51

RE: START_DOCUMENT срабатывает два раза по неведомым мне причинам.
Чтобы срабатывало 1 раз после первого case не нужен оператор break.

koleso
Сообщения: 2
Зарегистрирован: 06 июл 2013, 23:48

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

Сообщение koleso » 06 июл 2013, 23:55

Простите, но эту строчку я не могу понять
ivan160892 писал(а): in = new BufferedReader ( new InputStreamReader(response.getEntity().getContent (),"utf-8"));
Переменная in какого типа?

=bor=
Сообщения: 267
Зарегистрирован: 21 мар 2013, 12:26

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

Сообщение =bor= » 07 июл 2013, 09:52

Зачем дважды обнуляется tmp?

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

public class MainActivity extends Activity {
  final String LOG_TAG = "myLogs";
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    String tmp = "";
    try {
      XmlPullParser xpp = prepareXpp();

      while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
        switch (xpp.getEventType()) {
        // начало документа
        case XmlPullParser.START_DOCUMENT:
          Log.d(LOG_TAG, "START_DOCUMENT");
          break;
        // начало тэга
        case XmlPullParser.START_TAG:
          Log.d(LOG_TAG, "START_TAG: name = " + xpp.getName()
              + ", depth = " + xpp.getDepth() + ", attrCount = "
              + xpp.getAttributeCount());
          tmp = "";

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 08 июл 2013, 13:54

=bor= писал(а):Зачем дважды обнуляется tmp?
Первый раз пишу туда пустую строку, т.к. есть привычка не оставлять объекты равными null
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

koleso
Сообщения: 2
Зарегистрирован: 06 июл 2013, 23:48

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

Сообщение koleso » 17 июл 2013, 00:07

Извините пожалуйста, но я все-таки вклинюсь с вопросом о парсинге xml-файла с сервера.
Копал, рыл и даже что-то похожее нашел. Но не работает. Если xml-файл лежит в локальной паке - работает. На сервере - фигня!!! :(
Вот код для prepareXpp():

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

 XmlPullParser prepareXpp() throws XmlPullParserException, IOException {
                URL url = new URL( "http://levelup.accu-weather.com/widget/levelup/weather-data.asp?slat=59.678474&slon=30.461576&metric=1&LangId=25"); // ну например...
            XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
            XmlPullParser xpp = parserCreator.newPullParser();
            xpp.setInput(url.openStream(), null);
            return xpp;
          }
Подскажите, где ошибка? Заранее благодарен...

timur90
Сообщения: 5
Зарегистрирован: 10 авг 2013, 03:52

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

Сообщение timur90 » 10 авг 2013, 12:01

Извините за глупый вопрос. как создать main.xml для этого урока?просто в уроке нету файла main.xml

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 10 авг 2013, 12:33

В уроке, по-видимому, можно взять любой, пустой main.xml, т.к. никакие другие визуальные компоненты не используются.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

makandrey
Сообщения: 7
Зарегистрирован: 19 авг 2013, 13:36

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

Сообщение makandrey » 19 авг 2013, 15:35

Хочу выделить парсинг в отдельный класс, а в Activity использовать уже метод этого класса. Код парсинга взят из урока. Но программа не запускается, а выдает ошибку.
Я думаю проблема в этой части кода:

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

XmlPullParser prepareXpp() {
	    return context.getResources().getXml(R.xml.data);
	  }
т.к. метод getResource был не доступен, то я определил экземпляр context класса Context, но приложение в этом случае запускается с ошибкой.

Код обоих классов:

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

package com.example.example;

import java.io.IOException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

public class Test {
	
	Context context; 
	
	String tmp = "";
	final String LOG_TAG = "myLogs";
	   
	public void parse(){
	   try {
		   
	      XmlPullParser xpp = prepareXpp();

	      while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
	    	  switch (xpp.getEventType()) {
	    	  	// начало документа
	    	  	case XmlPullParser.START_DOCUMENT:
	    	  		Log.d(LOG_TAG, "START_DOCUMENT");
	    	  		break;
	        
	    	  	// начало тэга
	    	  	case XmlPullParser.START_TAG:
	    	  		Log.d(LOG_TAG, "START_TAG: name = " + xpp.getName()
	    	  				+ ", depth = " + xpp.getDepth() + ", attrCount = "
	    	  				+ xpp.getAttributeCount());
	          
	    	  		tmp = "";
	    	  		for (int i = 0; i < xpp.getAttributeCount(); i++) {
	    	  			tmp = tmp + xpp.getAttributeName(i) + " = "
	    	  					+ xpp.getAttributeValue(i) + ", ";
	    	  		}
	    	  		
	    	  		if (!TextUtils.isEmpty(tmp))
	    	  			Log.d(LOG_TAG, "Attributes: " + tmp);
	    	  		break;
	        
	    	  		// конец тэга
	    	  	case XmlPullParser.END_TAG:
	    	  		Log.d(LOG_TAG, "END_TAG: name = " + xpp.getName());
	    	  		break;
	        
	    	  		// содержимое тэга
	    	  	case XmlPullParser.TEXT:
	    	  		Log.d(LOG_TAG, "text = " + xpp.getText());
	    	  		break;

	    	  	default:
	    	  		break;
	        }
	    	  
	    	  // следующий элемент
	    	  xpp.next();
	      }
	      
	      	Log.d(LOG_TAG, "END_DOCUMENT");

	    } catch (XmlPullParserException e) {
	      e.printStackTrace();
	    } catch (IOException e) {
	      e.printStackTrace();
	    }
	  }

	  XmlPullParser prepareXpp() {
	    return context.getResources().getXml(R.xml.data);
	  }
	}

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

package com.example.example;

import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Test test = new Test();
		test.parse();

	}
}

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 19 авг 2013, 16:11

В классе Test сделай конструктор куда будет передаваться контекст:
[syntax=java]public Test(Context context) {
this.context = context;
}[/syntax]

в Activity:
Test test = new Test(this);
т.е. контекстом будет данное активити.

п.с. Экземпляр класса назвать test это нормально (и то лучше testMyClass или чтото типа того), но называть сам класс Test не есть гуд.

makandrey
Сообщения: 7
Зарегистрирован: 19 авг 2013, 13:36

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

Сообщение makandrey » 19 авг 2013, 16:32

klblk писал(а):В классе Test сделай конструктор куда будет передаваться контекст:
[syntax=java]public Test(Context context) {
this.context = context;
}[/syntax]

в Activity:
Test test = new Test(this);
т.е. контекстом будет данное активити.

п.с. Экземпляр класса назвать test это нормально (и то лучше testMyClass или чтото типа того), но называть сам класс Test не есть гуд.

ОК. Работает! Спасибо!

makandrey
Сообщения: 7
Зарегистрирован: 19 авг 2013, 13:36

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

Сообщение makandrey » 04 сен 2013, 17:07

Здравствуйте! У меня снова накопились вопросы по работе с xml.
Вопрос 1. Есть xml-файл с тестом:

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

<?xml version="1.0" encoding="UTF-8"?>
<test>
	<testName>Название теста</testName>
	<testDescription>Описание теста</testDescription>
	
	<questions>
	    
		<question>Вопрос 1
			<a>Ответ 1</a>
			<a>Ответ 2</a>
			<a>Ответ 3</a>
			<right>1</right>
			<src>"1.jpg"</src>
		</question>
	
		<question>Вопрос 2
			<a>Ответ 1</a>
			<a>Ответ 2</a>
			<a>Ответ 3</a>
			<right>2</right>
			<src>"2.jpg"</src>
		</question>
		
		<question>Вопрос 3
			<a>Ответ 1</a>
			<a>Ответ 2</a>
			<a>Ответ 3</a>
			<right>2</right>
			<src>"3.jpg"</src>
		</question>
		
	</questions>
</test>
Метод для получения вопроса реализован в отдельном классе, код метода:

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

public String getQuestion(){
		try {
			XmlPullParser xpp = prepareXpp();
			while (!(xpp.getEventType() == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("question"))){
				switch(xpp.getEventType()){
					case XmlPullParser.START_TAG:
						if (xpp.getName().equalsIgnoreCase("question")){
							xpp.next();
							question = xpp.getText();
						}
				}
				
				xpp.next();
			}
		    } catch (XmlPullParserException e) {
		      e.printStackTrace();
		    } catch (IOException e) {
		      e.printStackTrace();
		    }
		return question;
}
По задумке при нажатии на кнопку должен загружаться следующий вопрос, но каждый раз грузиться только первый.

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

public void onClick(View v) {	
		testName.setText(testParser.getQuestion()); //testName - это TextView
	}
И так - как сделать чтобы загружался следующий вопрос?


Вопрос 2 - Как получить и куда(ArrayList, простой массив или еще что?) лучше сохранить ответы к текущему вопросу?

Вопрос 3 - В какую папку ресурсов лучше сохранить файлы с тестами? Предполагается что их будет много. На данный момент это папка res/xml

Вопрос 4 - вытекающий из вопроса 3. В методе OnCreate нужно получить все имеющиеся тесты, т.е. перебрать все файлы тестов, которые есть в папке ресурсов. Это будет активити выбора теста с компонентом List. т.е. каждый элемент List - это отдельный тест и при щелчке по одному из них будет запущена другая активити, которой нужно передать какой именно xml-файл с тестом был выбран, чтобы его парсить дальше. Как это можно сделать?

Заранее спасибо за любую посильную помощь!

Kruler
Сообщения: 28
Зарегистрирован: 27 авг 2013, 13:02

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

Сообщение Kruler » 04 сен 2013, 22:12

makandrey писал(а): По задумке при нажатии на кнопку должен загружаться следующий вопрос, но каждый раз грузиться только первый.

1. XmlPullParser xpp = prepareXpp(); сделай глобальным/перенеси в конструктор.
при нажатии на кнопку у тебя постоянно пересоздается этот обьект и отсчет начинается с первого элемента.
хотя могу ошибаться :)
makandrey писал(а): Вопрос 3 - В какую папку ресурсов лучше сохранить файлы с тестами? Предполагается что их будет много. На данный момент это папка res/xml
читай уроки дальше, там будет работа с файлами

Tuhlom
Сообщения: 6
Зарегистрирован: 22 ноя 2012, 18:41

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

Сообщение Tuhlom » 07 сен 2013, 12:28

Скажите пожалуйста, есть ли инструмент для удобного создания и сохранения xml? Допустим, если я прочитал xml-файл, а дальше хочу внести в него изменения и сохранить?

meerz
Сообщения: 7
Зарегистрирован: 14 сен 2013, 02:14

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

Сообщение meerz » 15 сен 2013, 13:41

Здравствуйте
почему когда я парсю из интернета xml с русским текстом, в приложении отображаются кракозябры?

Kruler
Сообщения: 28
Зарегистрирован: 27 авг 2013, 13:02

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

Сообщение Kruler » 15 сен 2013, 18:20

meerz писал(а):Здравствуйте
почему когда я парсю из интернета xml с русским текстом, в приложении отображаются кракозябры?
не та кодировка, гугли "java windows-1251 to utf-8"
ну или вместо 1251 подставь свои цифры :)
но это если я правильно понял проблему, текст на английском нормально выводится?

vsadmin
Сообщения: 4
Зарегистрирован: 16 сен 2013, 13:33

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

Сообщение vsadmin » 16 окт 2013, 10:06

За ранее прошу не кидать помидорами, так как я очень новичок. И встал собственно такой вопрос:
Есть XML который надо пропарсить такого типа:

<main_tag1>Значение1</main_tag1>
<main_tag2>Значение2</main_tag2>
<main_tag3>Значение3</main_tag3>
<main_tag4>
<tag1>Значение4</tag1>
<tag2>Значение5</tag2>
<tag3>Значение6</tag3>
</main_tag4>
<main_tag4>
<tag1>Значение7</tag1>
<tag2>Значение8</tag2>
<tag3>Значение9</tag3>
</main_tag4>
<main_tag4>
<tag1>Значение10</tag1>
<tag2>Значение11</tag2>
<tag3>Значение12</tag3>
</main_tag4>
</main_tag1>


Получить значения мне надо в элементы TextView
Делаю так:
public class MainActivity extends Activity {
TextView tV1;
TextView tV2;
TextView tV3;
TextView tV4;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tV1 = (TextView)findViewById(R.id.tV1);
tV2 = (TextView)findViewById(R.id.tV2);
tV3 = (TextView)findViewById(R.id.tV3);
tV4 = (TextView)findViewById(R.id.tV4);

try{
XmlPullParser parser = getResources().getXml(R.xml.mdata);

while (parser.getEventType()!= XmlPullParser.END_DOCUMENT) {
if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().equals("main_tag2")) {
//
tV1.setText(parser.nextText());
}
parser.next();
if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().equals("tag2")) {
//
tV2.setText(parser.nextText());
}
parser.next();
if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().equals("tag2")) {
//
tV3.setText(parser.nextText());
}
parser.next();
if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().equals("tag2")) {
//
tV4.setText(parser.nextText());
}
parser.next();
}
}
catch (Throwable t) {
Toast.makeText(this,
"Ошибка при загрузке XML-документа: " + t.toString(), Toast.LENGTH_LONG)
.show();
}

Ну и ничего не выходит, в tV2 вставляет значение последнего tag2 и на этом всё(.
Если оставить только 2 TextView и обработку их, то в первый текствью парсит нормально, а во второй значение последнего.
Еще раз прошу прощение за то что мой вопрос для вас может показаться глупым, ну и а то что неумею прятать код в сойлер. Спасибо

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

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

Сообщение trew » 16 окт 2013, 11:05

Прятать код просто, в редакторе (нажать кнопку Редактор) ищите Geshi Syntax: XML, Java.

У Вас значение "tag2" повторяется, поэтому комп его перетирает. И в итоге там оказывается последнее значение.
[syntax=xml]
<?xml version="1.0" encoding="utf-8"?>
<main_tag1>
<main_tag1>Значение1</main_tag1>
<main_tag2>Значение2</main_tag2>
<main_tag3>Значение3</main_tag3>

<main_tag4>
<tag1>Значение4</tag1>
<tag2>Значение5</tag2>
<tag3>Значение6</tag3>
</main_tag4>

<main_tag4>
<tag1>Значение7</tag1>
<tag2>Значение8</tag2>
<tag3>Значение9</tag3>
</main_tag4>

<main_tag4>
<tag1>Значение10</tag1>
<tag2>Значение11</tag2>
<tag3>Значение12</tag3>
</main_tag4>
</main_tag1>
[/syntax]
Показываю неправильный вариант:
[syntax=java]
import org.xmlpull.v1.XmlPullParser;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
TextView tV1;
TextView tV2;
TextView tV3;
TextView tV4;
final String TAG ="mylog";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

tV1 = (TextView)findViewById(R.id.tV1);
tV2 = (TextView)findViewById(R.id.tV2);
tV3 = (TextView)findViewById(R.id.tV3);
tV4 = (TextView)findViewById(R.id.tV4);

Integer a1 =0, a2=0, a3=0;

try{
XmlPullParser parser = getResources().getXml(R.xml.data);

while (parser.getEventType()!= XmlPullParser.END_DOCUMENT) {

if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().equals("main_tag2")) {
tV1.setText(parser.nextText());
}
//parser.next();

if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().equals("tag2")
&& a1 ==0) {
a1=1;
tV2.setText(parser.nextText());
}
//parser.next();

if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().equals("tag2")
&& a2 ==0) {
a2 =1;
tV3.setText(parser.nextText());
}
//parser.next();

if (parser.getEventType() == XmlPullParser.START_TAG
&& parser.getName().equals("tag2")
&& a3 ==0) {
a3 =1;
tV4.setText(parser.nextText());
}

parser.next();


} // while

}
catch (Throwable t) {
Toast.makeText(this,
"Ошибка при загрузке XML-документа: " + t.toString(), Toast.LENGTH_LONG)
.show();
}

} // protected onCreate

} // class
[/syntax]
С помощью переменных, как показано в коде, парсить не стоит.

Правильный вариант - это записать все значения "tag2" в масcив ArrayList. А из него в поля TextView.
Других вариантов не придумал, набираюсь опыта.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Ответить