Нужна помощь для Android XmlPullParser
Здравствуйте все!
В настоящее время я занимаюсь разработкой приложения для Android (для начинающих), и мне нужно управлять XML-файлами, на самом деле мне нужно сохранять некие "циклы", созданные пользователем. Поэтому мне нужно сохранить и загрузить эти циклы из XML-файлов.
Что такое цикл?
Простой, он состоит из нескольких "шагов", каждый шаг содержит 4 элемента: "num_act", "nb_cm", "entrees", "sorties". (Извините, но некоторые части моего кода написаны на французском языке, на французском etape = шаг, входы = входы, вылеты = выходы).
Я пытался реализовать это и много искал на некоторых страницах, таких как: Создать XML-файл и сохранить его во внутреннем хранилище Android, но на самом деле это не работает, и я не могу понять проблемы:
- Я не могу открыть сохраненный файл даже с другим apk ("souce file not found"), поэтому я не могу проверить егоUPDATE => Все в порядке, теперь я сохраняю все свои файлы в хранилище sd.
файлы, которые я пытаюсь прочитать во время загрузки, кажутся почти пустыми
Поэтому мне было интересно, не могли бы вы помочь мне, пожалуйста.
Все сделано с диалогами.
Много ли ошибок во время объявлений синтаксического анализатора или других элементов, спасибо?
ОБНОВЛЕНИЕ Я все еще ищу, и я выяснил, что проблема в том, что созданный файл XML ВСЕГДА ПУСТО. Я пробовал много вещей (писатель строк и т. Д., ....).
ОБНОВЛЕНИЕ 2 Это было долго, я выяснил проблему... на всякий случай, будьте очень осторожны с дескрипторами файлов, и на самом деле, для решения проблем EMPTY FILES не пишите: fos = openFileOutput(filename,Context.MODE_APPEND); // НЕТ НЕТ НЕТ: MODE_APPEND приводит к пустым файлам
СОХРАНИТЕ ЦИКЛ В ФАЙЛЕ XML:
/***Saving in a file******************/
button_save.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.save_cycle);
dialog.setTitle("Save of the cycle");
final EditText nom_cycle = (EditText) dialog.findViewById(R.id.nom_cycle);
final Button save2 = (Button) dialog.findViewById(R.id.save);
/*****Save all the steps*****/
save2.setOnClickListener(new OnClickListener(){
@SuppressWarnings("resource")
@Override
public void onClick(View v) {
String filename = nom_cycle.getText().toString();
File f = new File(getFilesDir(),filename + ".xml");
FileOutputStream fos;
try {
fos = new FileOutputStream(f);
fos = openFileOutput(filename,Context.MODE_APPEND); //NO NO NO MODE APPEND leades TO EMPTY FILES
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(fos, "UTF-8");
serializer.startDocument(null, Boolean.valueOf(true));
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
for(int j = 0 ; j < c.liste_etapes.size() ; j++)
{
serializer.startTag("", "etape");
serializer.startTag("", "num_act");
serializer.text(Integer.toString(c.liste_etapes.get(j).getNumero_act()));
serializer.endTag("", "num_act");
serializer.startTag("", "nb_cm");
serializer.text(Integer.toString(c.liste_etapes.get(j).getNbCm()));
serializer.endTag("", "nb_cm");
serializer.startTag("", "entrees");
serializer.text(c.liste_etapes.get(j).getEntrees().toString());
serializer.endTag("", "entrees");
serializer.startTag("", "sorties");
serializer.text(c.liste_etapes.get(j).getSorties().toString());
serializer.endTag("", "sorties");
serializer.endTag("", "etape");
}
//writer.toString();
//String dataWrite = writer.toString();
//fos.write(dataWrite.getBytes());
serializer.endDocument();
serializer.flush();
fos.close();
}
catch (Exception e) {
throw new RuntimeException(e);
}
dialog.dismiss();
}
});
dialog.show();
}
});
ЗАГРУЗКА ИЗ ФАЙЛА XML
load.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.load_cycle);
dialog.setTitle("Liste des cycles sauvegardés : ");
final ArrayList<String> FilesInFolder = GetFiles(getFilesDir().toString());
ListView lv = (ListView) dialog.findViewById(R.id.files);
lv.setAdapter(new ArrayAdapter<String>(context,
android.R.layout.simple_list_item_1, FilesInFolder));
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
FileInputStream fis;
InputStreamReader isr;
int eventType = 0;
XmlPullParser xpp = null;
ArrayList<String> tmp_list = new ArrayList<String>();
try{
//get filename
final String xmlFile = FilesInFolder.get(position);
//preparing lecture in the file
fis = getApplicationContext().openFileInput(xmlFile);
isr = new InputStreamReader(fis);
char[] inputBuffer = new char[fis.available()];
isr.read(inputBuffer);
String data = new String(inputBuffer); //on lira ici pour les données par la suite
isr.close();
fis.close();
//declaration of xml parser
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
xpp = factory.newPullParser();
//stream given to the parser
xpp.setInput( new StringReader (data) );
//get the first elements of the xml file
eventType = xpp.getEventType();
}
catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
String num_act = "", nb_cm = "", entrees= "", sorties= "";
Cycle loaded_cycle = new Cycle();
while (eventType != XmlPullParser.END_DOCUMENT){
String name = xpp.getName();
switch (eventType){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.END_TAG:
break;
case XmlPullParser.TEXT:
if(name.equals("nb_act")){
num_act = xpp.getText();
}
if(name.equals("nb_cm")){
nb_cm = xpp.getText();
}
if(name.equals("entrees")){
entrees = xpp.getText();
}
if(name.equals("sorties")){
sorties = xpp.getText();
}
break;
}
try{
//we continue PARSING the file
eventType = xpp.next();
}
catch (XmlPullParserException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
//just some tests of creating a step
int nact = 0, ncm = 0;
if(num_act != "") nact = Integer.valueOf(num_act);
if(nb_cm != "") ncm = Integer.valueOf(nb_cm);
Etape loaded_etape = new Etape(nact, ncm, new ArrayList<Integer>(),new ArrayList<Integer>());
loaded_cycle.ajouterEtape(loaded_etape);
}
c = loaded_cycle;
dialog.dismiss();
}
});
dialog.show();
}
});