Страница 3 из 5

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

Добавлено: 10 май 2013, 11:16
tytryn
Подскажите пожалуйста, как вместо этой строчки:

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

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

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

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

Добавлено: 26 май 2013, 14:09
ivan160892
Наверно как то так:
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));

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

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

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

Добавлено: 08 июн 2013, 22:51
Natalia
RE: START_DOCUMENT срабатывает два раза по неведомым мне причинам.
Чтобы срабатывало 1 раз после первого case не нужен оператор break.

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

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

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

Добавлено: 07 июл 2013, 09:52
=bor=
Зачем дважды обнуляется 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 = "";

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

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

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

Добавлено: 17 июл 2013, 00:07
koleso
Извините пожалуйста, но я все-таки вклинюсь с вопросом о парсинге 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;
          }
Подскажите, где ошибка? Заранее благодарен...

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

Добавлено: 10 авг 2013, 12:01
timur90
Извините за глупый вопрос. как создать main.xml для этого урока?просто в уроке нету файла main.xml

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

Добавлено: 10 авг 2013, 12:33
Foenix
В уроке, по-видимому, можно взять любой, пустой main.xml, т.к. никакие другие визуальные компоненты не используются.

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

Добавлено: 19 авг 2013, 15:35
makandrey
Хочу выделить парсинг в отдельный класс, а в 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();

	}
}

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

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

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

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

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

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

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

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

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

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

Добавлено: 04 сен 2013, 17:07
makandrey
Здравствуйте! У меня снова накопились вопросы по работе с 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-файл с тестом был выбран, чтобы его парсить дальше. Как это можно сделать?

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 16 окт 2013, 10:06
vsadmin
За ранее прошу не кидать помидорами, так как я очень новичок. И встал собственно такой вопрос:
Есть 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 и обработку их, то в первый текствью парсит нормально, а во второй значение последнего.
Еще раз прошу прощение за то что мой вопрос для вас может показаться глупым, ну и а то что неумею прятать код в сойлер. Спасибо

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

Добавлено: 16 окт 2013, 11:05
trew
Прятать код просто, в редакторе (нажать кнопку Редактор) ищите 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.
Других вариантов не придумал, набираюсь опыта.