IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Fichier XML et Android


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut Fichier XML et Android
    Bonjour,

    dans le but de créer une application, type quiz, j'ai construit un petit fichier xml, mais je ne sais pas comment faire pour l'utiliser.

    j'ai mis le fichier .xml dans /res/raw/question.xml

    Dois je le parser ? dois je le recupérer sous forme de ressource ? (R.)

    je vous mets un screen du fichier xml ainsi que mon bout de code pour le test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package fr.guigui.test;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
     
    public class Parser {
     
    	private File file = new File("question.xml");
     
     
    	public Parser() throws ParserConfigurationException, FileNotFoundException, SAXException, IOException {
    		// TODO Auto-generated constructor stub
     
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = factory.newDocumentBuilder();
    		Document dom = builder.parse(new FileInputStream(file));
    		Element root = dom.getDocumentElement();
     
    		NodeList items = root.getElementsByTagName("question");
     
    for(int i = 0; i < items.getLength(); i++){
    	Node item = items.item(i);
    	String value = item.getAttributes().getNamedItem("value").getNodeValue();
    	System.out.println("affichage contenu récupérer du fichier xml : "+value);
    }
    	}
     
     
     
     
    }
    j'ai une erreur comme quoi il ne trouve pas le fichier question.xml.C'est la premiere fois que je veux utiliser un fichier xml en ressource de donnée, j'ai trop eu l'habitude de SQLlite.

    Merci de m'éclairer.
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Tu peux utiliser cette méthode qui prend en paramètre un context et l'identifiant de la ressource (R.raw.tonFichier) et retourne un String correspondant au contenu du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public static String readRawTextFile(Context ctx, int resId) {
            InputStream inputStream = ctx.getResources().openRawResource(resId);
     
            InputStreamReader inputreader = new InputStreamReader(inputStream);
            BufferedReader buffreader = new BufferedReader(inputreader);
            String line;
            StringBuilder text = new StringBuilder();
     
            try {
                while ((line = buffreader.readLine()) != null) {
                    text.append(line);
                }
            } catch (IOException e) {
                return null;
            }
            return text.toString();
        }

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut traitement suivant la lecture fichier xml
    Bonjour,

    j'arrive à récupérer le contenu de mon fichier xml sous android, via ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    package fr.guigui.test;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
     
    import android.content.Context;
     
    public class Parser {
     
    	public static String readRawTextFile(Context ctx, int resId) {
            InputStream inputStream = ctx.getResources().openRawResource(resId);
     
            InputStreamReader inputreader = new InputStreamReader(inputStream);
            BufferedReader buffreader = new BufferedReader(inputreader);
            String line;
            StringBuilder text = new StringBuilder();
     
            try {
                while ((line = buffreader.readLine()) != null) {
                    text.append(line);
                }
            } catch (IOException e) {
                return null;
            }
            return text.toString();
        }
     
     
     
     
    }
    détaille de ma classe mainActivity :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package fr.guigui.test;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
     
    public class MainActivity extends Activity {
     
    	String contenu = null;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
     
    		contenu = Parser.readRawTextFile(this, R.raw.question);
    		System.out.println("contenu = "+contenu);
    		if(contenu != null){
    			Log.v("fin lecture fichier", "lecture fichier terminée sans erreur");
    		}else{
    			Log.d("erreur lecture", "le fichier xml n'a pas pu etre lu");
    		}
     
     
    	}
     
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
     
    }
    résultat dans mon débugger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    09-20 08:16:45.875: D/dalvikvm(848): GC_CONCURRENT freed 95K, 17% free 499K/596K, paused 1ms+1ms, total 13ms
    09-20 08:16:45.875: D/jdwp(848): Got wake-up signal, bailing out of select
    09-20 08:16:45.875: D/dalvikvm(848): Debugger has detached; object registry had 1 entries
    09-20 08:16:46.015: E/SurfaceFlinger(36): ro.sf.lcd_density must be defined as a build property
    09-20 08:16:46.295: E/Trace(858): error opening trace file: No such file or directory (2)
    09-20 08:16:47.386: I/System.out(858): contenu = <?xml version="1.0" encoding="UTF-8"?><Question>    <question numero="1">        <value>quel est la couleur de mon xperia Z</value>    </question>    <reponse numQ="1">        <value vrai="false">bleu</value>        <value vrai="false">vert</value>        <value vrai="true">noir</value>        <value vrai="false">rouge</value>    </reponse>     </Question>
    09-20 08:16:47.405: D/dalvikvm(858): GC_CONCURRENT freed 43K, 6% free 2847K/3012K, paused 17ms+15ms, total 207ms
    09-20 08:16:47.415: V/fin lecture fichier(858): lecture fichier terminée sans erreur
    09-20 08:16:47.765: E/SurfaceFlinger(36): ro.sf.lcd_density must be defined as a build property
    09-20 08:16:47.785: D/libEGL(858): loaded /system/lib/egl/libEGL_emulation.so
    09-20 08:16:47.806: D/(858): HostConnection::get() New Host Connection established 0x2a1645d0, tid 858
    j'aimerais savoir ce que je dois faire pour pouvoir interpréter le contenu de mon fichier xml. Pouvez vous m'aider , merci.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Pour interpréter un fichier xml, il te faut ce que l'on appelle un Parser.
    Il en existe plusieurs à toi de choisir celui qui te convient le mieux.
    Une petite recherche sur ce forum ou sur Google te donnera des solutions.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut
    Salut et merci pour ton aide, j'ai fait ça pour utiliser SAX.

    mon MainActivity :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    package fr.guigui.test;
     
    import java.io.File;
    import java.io.IOException;
     
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
     
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
     
    public class MainActivity extends Activity {
     
    	String contenu = null;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    /*
    		contenu = Parser.readRawTextFile(this, R.raw.questionnaire);
    		System.out.println("contenu = "+contenu);
    		if(contenu != null){
    			Log.v("fin lecture fichier", "lecture fichier terminée sans erreur");
    		}else{
    			Log.d("erreur lecture", "le fichier xml n'a pas pu etre lu");
    		}
    		*/
     
    		SAXParserFactory fabrique = SAXParserFactory.newInstance();
    		SAXParser parseur = null;
    		try {
    			parseur = fabrique.newSAXParser();
    		} catch (ParserConfigurationException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		} catch (SAXException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
     
    		Context ctx = this ;
    		File xml = (File)ctx.getResources().getXml(R.raw.questionnaire);
     
    		//File fichier = new File("./ExempleSAX.xml");
    		DefaultHandler gestionnaire = new QuestionnaireHandler();
    		try {
    			parseur.parse(xml, gestionnaire);
    		} catch (SAXException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
     
    	}
     
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
     
    }
    ma classe QuestionnaireHandler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    package fr.guigui.test;
     
    import java.util.LinkedList;
    import java.util.List;
     
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    public class QuestionnaireHandler extends DefaultHandler{
    	//résultats de notre parsing
    	private List<Question> questionnaire;
    	private Question question;
    	private Reponse reponse;
    	//flags nous indiquant la position du parseur
    	private boolean inQuestionnaire, inQuestion, inReponse;
    	//buffer nous permettant de récupérer les données 
    	private StringBuffer buffer;
     
    	// simple constructeur
    	public QuestionnaireHandler(){
    		super();
    	}
    	//détection d'ouverture de balise
    	public void startElement(String uri, String localName,
    			String qName, Attributes attributes) throws SAXException{
    		if(qName.equals("questionnaire")){
    			questionnaire = new LinkedList<Question>(); 
    			inQuestionnaire = true;
    		}else if(qName.equals("question")){
    			question = new Question();
    			try{
    				int numeroQuestion = Integer.parseInt(attributes.getValue("numero"));
    				question.setNumeroQuestion(numeroQuestion);
    			}catch(Exception e){
    				//erreur, le contenu de id n'est pas un entier
    				throw new SAXException(e);
    			}
    			inQuestion = true;
    		}else {
    			buffer = new StringBuffer();
    			if(qName.equals("reponse")){
    				reponse = new Reponse();
    				try{
    					int numeroReponse = Integer.parseInt(attributes.getValue("numQ"));
    					reponse.setIdReponse(numeroReponse);
     
    				}catch(Exception e){
     
    				}
    				inReponse = true;
    			}else{
    				//erreur, on peut lever une exception
    				throw new SAXException("Balise "+qName+" inconnue.");
    			}
    		}
    	}
    	//détection fin de balise
    	public void endElement(String uri, String localName, String qName)
    			throws SAXException{
    		if(qName.equals("questionnaire")){
    			inQuestionnaire = false;
    		}else if(qName.equals("question")){
    			questionnaire.add(question);
    			question = null;
    			inQuestion = false;
    		}else if(qName.equals("reponse")){
    			question.setQuestion(buffer.toString()); //setNom(buffer.toString());
    			buffer = null;
    			inReponse = false;
    		}else{
    			//erreur, on peut lever une exception
    			throw new SAXException("Balise "+qName+" inconnue.");
    		}          
    	}
    	//détection de caractères
    	public void characters(char[] ch,int start, int length)
    			throws SAXException{
    		String lecture = new String(ch,start,length);
    		if(buffer != null) buffer.append(lecture);       
    	}
    	//début du parsing
    	public void startDocument() throws SAXException {
    		System.out.println("Début du parsing");
    	}
    	//fin du parsing
    	public void endDocument() throws SAXException {
    		System.out.println("Fin du parsing");
    		System.out.println("Resultats du parsing");
    		for(Question q : questionnaire){
    			System.out.println(q);
    		}
    	}
    }
    Mon fichier questionnaire.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
     
    <questionnaire>
        <question numero="1">
            <value>quel est la couleur de mon xperia Z</value>
        </question>
        <reponse numQ="1">
            <value vrai="false" id="1">bleu</value>
            <value vrai="false" id="2">vert</value>
            <value vrai="true" id="3">noir</value>
            <value vrai="false" id="4">rouge</value>
        </reponse>
     
    </questionnaire>
    Mon résultat en console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    09-20 09:33:53.145: E/Trace(1384): error opening trace file: No such file or directory (2)
    09-20 09:33:53.695: D/dalvikvm(1384): GC_CONCURRENT freed 43K, 6% free 2816K/2980K, paused 15ms+15ms, total 192ms
    09-20 09:33:53.705: W/ResourceType(1384): Bad XML block: header size 28024 or total size 1702240364 is larger than data size 422
    09-20 09:33:53.735: D/AndroidRuntime(1384): Shutting down VM
    09-20 09:33:53.735: W/dalvikvm(1384): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
    09-20 09:33:53.805: E/AndroidRuntime(1384): FATAL EXCEPTION: main
    09-20 09:33:53.805: E/AndroidRuntime(1384): java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.guigui.test/fr.guigui.test.MainActivity}: android.content.res.Resources$NotFoundException: File res/raw/questionnaire.xml from xml type xml resource ID #0x7f040000
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.app.ActivityThread.access$600(ActivityThread.java:141)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.os.Looper.loop(Looper.java:137)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.app.ActivityThread.main(ActivityThread.java:5041)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at java.lang.reflect.Method.invokeNative(Native Method)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at java.lang.reflect.Method.invoke(Method.java:511)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at dalvik.system.NativeStart.main(Native Method)
    09-20 09:33:53.805: E/AndroidRuntime(1384): Caused by: android.content.res.Resources$NotFoundException: File res/raw/questionnaire.xml from xml type xml resource ID #0x7f040000
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.content.res.Resources.loadXmlResourceParser(Resources.java:2186)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.content.res.Resources.loadXmlResourceParser(Resources.java:2141)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.content.res.Resources.getXml(Resources.java:902)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at fr.guigui.test.MainActivity.onCreate(MainActivity.java:50)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.app.Activity.performCreate(Activity.java:5104)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	... 11 more
    09-20 09:33:53.805: E/AndroidRuntime(1384): Caused by: java.io.FileNotFoundException: Corrupt XML binary file
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.content.res.AssetManager.openXmlAssetNative(Native Method)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:487)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	at android.content.res.Resources.loadXmlResourceParser(Resources.java:2168)
    09-20 09:33:53.805: E/AndroidRuntime(1384): 	... 17 more
    Une idée ? :'( .

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/06/2015, 15h26
  2. lecture ecriture d'un fichier xml sous android
    Par ouarda090 dans le forum Android
    Réponses: 5
    Dernier message: 03/03/2014, 11h07
  3. Parser un fichier XML en Android
    Par sabrineisimm dans le forum Android
    Réponses: 11
    Dernier message: 03/09/2011, 21h52
  4. parser fichier xml et afficher sous android
    Par tabbabi dans le forum Android
    Réponses: 4
    Dernier message: 20/07/2011, 18h01
  5. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo