#java #android #simple-framework
#java #Android #simple-framework
Вопрос:
Я пытаюсь научиться использовать xml в Java (платформа Android, с использованием Eclipse и simple-xml-2.5.2). Я продолжаю получать странный java.lang.Ошибка StackOverflowError в строке «serial.read» в «Training.java «. Можете ли вы помочь устранить проблему? Это ошибка определения xml?
Я включаю источник ниже:
Файл beacons.java:
package com.marcos.training;
import java.util.List;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
@Element
public class Beacons {
@ElementList(inline=true)
private List<Beacon> list;
@Element
private String id;
public String getId() {
return id;
}
public Integer getSize() {
return list.size();
}
public List<Beacon> getList() {
return list;
}
}
Файл Beacon.java:
package com.marcos.training;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
@Root
public class Beacon {
@Attribute
protected String ssid;
@Element
protected String bssid;
public String getSsid() {
return ssid;
}
public String getBssid() {
return bssid;
}
}
Файл Training.java:
package com.marcos.training;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.content.res.Resources.NotFoundException;
public class Training extends Activity {
private final static String TAG = Training.class.getCanonicalName();
TextView textStatus;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textStatus = (TextView) findViewById(R.id.textStatus);
Serializer serial = new Persister();
try {
Beacons myBeacons;
try {
myBeacons = serial.read(Beacons.class, getResources().openRawResource(R.xml.beacons));
Log.i(TAG, "Number of Beacons: " myBeacons.getSize());
} catch (NotFoundException e) {
Log.d(TAG, "Uncaught exception", e);
return;
} catch (Exception e) {
Log.d(TAG, "Uncaught exception", e);
return;
}
int len = myBeacons.getSize();
for (int i = 0; i < len; i ) {
Beacon b = myBeacons.getList().get(i);
textStatus.append("Beacon " (i 1) "n");
textStatus.append(" SSID : " b.getSsid() "n");
textStatus.append(" BSSID : " b.getBssid() "n");
textStatus.append("n");;
}
} catch (Exception e) {
Log.d(TAG, "Uncaught exception", e);
}
}
}
Файл beacons.xml:
<?xml version="1.0" encoding="utf-8"?>
<beacons id="1">
<beacon ssid="north">
<bssid>01:02:03:04:05:06</bssid>
</beacon>
<beacon ssid="east">
<bssid>02:03:04:05:06:07</bssid>
</beacon>
<beacon ssid="south">
<bssid>03:04:05:06:07:08</bssid>
</beacon>
<beacon ssid="west">
<bssid>04:05:06:07:08:09</bssid>
</beacon>
</beacons>
Ответ №1:
Помещая ваш XML-файл в XML-каталог ресурсов, система сборки Android предполагает, что вы хотите, чтобы он был скомпилирован в двоичный формат, и это обязывает вас. Поэтому, когда вы обращаетесь к этому входному потоку, а затем пытаетесь обработать его как текстовое представление XML, это просто не работает. У вас есть 2 варианта.
- Переместите ваш XML-файл в
resraw
каталог. - Оставьте все как есть, используйте
getResources().getXml(R.xml.beacons)
API и создайте анализатор извлечения для вашего конкретного XML.
Смотрите эту ссылку для получения более подробной информации.
Комментарии:
1. Спасибо! Это было действительно решение! Ты спас мой день 🙂