Lecture d'un Asset XML avec SAX
Bonjour à tous (et au passage bonnes fêtes!),
J'ai fait une petite application récemment en Java/Swing, et je souhaitais faire une nouvelle interface pour Android tout en gardant le coeur "calculatoire" déjà existant. Je créé donc un nouveau projet et me sert de l'existant en dépendance.
Je m'appuie sur des fichiers XML pour définir certaines des données nécessaires à mon application, et si je les lis sans problème avec Java "normal", sous Android, ça coince un peu.
Dans mon activity principale, je créé les inputstream de cette manière :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| Map<String,InputStream> files = new HashMap<String,InputStream>();
try {
files.put("Fichier1", getAssets().open("Fichier1.xml"));
files.put("Fichier2", getAssets().open("Fichier2.xml"));
files.put("Fichier3", getAssets().open("Fichier3.xml"));
} catch (IOException e) {
// ...
}
CardMaker.createCardList(files); |
Le maker s'appuie sur un parseur SAX :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
public static void createCardList(Map<String,InputStream> files){
// TODO : Transfer to Model for DAO
SAXParserFactory fabrique = SAXParserFactory.newInstance();
SAXParser parseur;
try {
parseur = fabrique.newSAXParser();
CardHandler gestionnaire = new CardHandler();
parseur.parse(files.get("Fichier1"), gestionnaire);
Card.oneCards = gestionnaire.getCards();
gestionnaire = new CardHandler();
parseur.parse(files.get("Fichier2"), gestionnaire);
Card.twoCards = gestionnaire.getCards();
gestionnaire = new CardHandler();
parseur.parse(files.get("Fichier3"), gestionnaire);
Card.threeCards = gestionnaire.getCards();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} |
La classe Card est un conteneur pour mes données.
Le parseur est un parseur tout banal qui lit balise ouverture/fermeture, etc...
Code:
1 2 3 4 5 6 7 8 9
| public void characters(char[] ch, int start, int length)
throws SAXException {
String read = new String(ch,start,length);
if(buffer != null){
buffer.append(read);
}
} |
Lorsque je met un point d'arrêt au niveau de la fonction characters du parseur, le ch ne contient qu'un saut de ligne, et rien d'autre là où sur l'application "normale", je retrouve tout mon fichier xml.
Il n'y a pas de problème au niveau de la taille des fichiers (ils font 5ko max chacun), et apparemment la lecture des assets se fait puisque la fonction suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public static String readInputStreamAsString(InputStream in)
throws IOException {
BufferedInputStream bis = new BufferedInputStream(in);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while(result != -1) {
byte b = (byte)result;
buf.write(b);
result = bis.read();
}
return buf.toString();
} |
Appelée avec le getAssets().open("file.xml"); me renvoie bien la chaine avec tout mon joli fichier...
Donc là je coince, je soupçonne de mal m'y prendre avec les inputstream et les assets, mais où est l'erreur?? Je n'ai aucune exception nulle part, si ce n'est dans la suite du programme lorsqu'il tombe sur une recherche sur des informations désespérément vides.
Merci d'avoir pris le temps de me lire, et merci à ceux qui pourraient éclairer ma lanterne.