bonjour,
mes fichier XML sont encoding="iso-8859-1"
le texte s'affiche avec des symboles, est il possible de modifier le encoding dans le chargement du donnée, je parcouris mes fichier XML avec DOM
merci
bonjour,
mes fichier XML sont encoding="iso-8859-1"
le texte s'affiche avec des symboles, est il possible de modifier le encoding dans le chargement du donnée, je parcouris mes fichier XML avec DOM
merci
L'encoding d'un fichier XML est spécifié dans celui-ci:
Il suffit de mettre UTF-8 par exemple...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <?xml version="1.0" encoding="ISO-8859-1"?>
Ensuite normalement, un parser XML se chargera d'adapter le flux de données en conséquence.
En java, tout est en UTF-16 donc aucun soucis...
C'est bien au transfert Java <-> fichier que doit se faire la traduction...
Normalement, DocumentBuilder.parse() se charge de tout.
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
salut,
je ne peux pas changer les fichiers XML, je dois travaillé avec ce fichier sans rien changé d'autre application lisent de ses fichiers.
est ce qu'il y a une methode de lire ces fichier est par exemple le convetir ou bien changer l'encoding
Et le fichier il dit quoi comme "encoding" ?
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
Tu peux nous poster (en attachement) un fichier qui pose problème.
bonjour,
dsl pour ce long absence, je suis toujours dans le même problème
voici le lien du fichier xml
http://femme.ccuisiner.com/tests/artculture.xml
merci pour votre aide
Il n'y a rien à convertir dans ces fichiers, ils sont corrects, ils sont déclaré iso-8859-1 et c'est bien du iso-8859-1. Donc ton problème survient à l'affichage. Tu affiche comment tes données pour avoir des erreurs?
je parcoure le fichier en DOM, le problème est que pas tout les caractères spéciaux s'affichant correct , ils y ont qui s'affichant correct et autre des carreaux
En fait on ne "parcourt" pas un fichier en DOM...
A. Il y a un fichier...
B. Ce fichier est lu par Java comme une suite de caractère (encoding)
C. Cette suite de caractères (Java) est parsée en un DOM-Java (Document Object Model)
D. La parcours du DOM est faite.
E. L'affichage est réalisé.
Comme (C), (D) et (E) sont du "java pur" (ou presque), les seuls "gros" soucis (à priori) peuvent être (A) et (B).
On a vérifié (A) => c'est bon le fichier est en ISO-8859-1
Il faut maintenant vérifier (B)... et là cela peut dépendre de ton code...
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
j'éspére que c'est la partie que vous voulez
voici le 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
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 public class MainActivity extends Activity { // All static variables static final String URL = "http://femme.ccuisiner.com/tests/artculture.xml"; // XML node keys static final String KEY_ITEM = "item"; // parent node static final String KEY_TITLE = "title"; static final String KEY_AUTHOR = "author"; static final String KEY_DESC = "description"; static final String KEY_PHOTO = "photo"; static final String KEY_PUBDATE = "pubDate"; ListView list; LazyAdapter adapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); XMLParser parser = new XMLParser(); String xml = parser.getXmlFromUrl(URL); // getting XML from URL Document doc = parser.getDomElement(xml); // getting DOM element NodeList nl = doc.getElementsByTagName(KEY_ITEM); for (int i = 0; i < nl.getLength(); i++) { // creating new HashMap HashMap<String, String> map = new HashMap<String, String>(); Element e = (Element) nl.item(i); // adding each child node to HashMap key => value map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); map.put(KEY_DESC, parser.getValue(e, KEY_DESC)); map.put(KEY_AUTHOR, parser.getValue(e, KEY_AUTHOR)); map.put(KEY_PUBDATE, parser.getValue(e, KEY_PUBDATE)); map.put(KEY_PHOTO, parser.getValue(e, KEY_PHOTO)); // adding HashList to ArrayList songsList.add(map); } list=(ListView)findViewById(R.id.liste); adapter=new LazyAdapter(this, songsList); list.setAdapter(adapter); // Button b=(Button)findViewById(R.id.button1); // b.setOnClickListener(listener); // Button i =(Button)findViewById(R.id.button1); // i.setOnClickListener(listener); } @Override public void onDestroy() { list.setAdapter(null); super.onDestroy(); } }
Et ne crash pas ce code ?
Normalement tu devrais avoir un NetworkOnMainThreadException
(il est interdit de downloader du Net dans une fonction UI comme onCreate(), onClick(), etc...).
Sinon, en fait c'est ce que je disais dans mon message, l'important c'est la conversion en caractères donc c'est le code de "getXmlFromUrl" qu'il nous faudrait.
Quelque chose me dit que le code en question ne tiens pas compte de l'encoding HTTP... ou pire, il a l'air de transformer en String (ce qui nécessite un parsing du XML quand même) sans tenir compte de ce qui est écrit dans le XML....
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
le voila
merci poir votre aide
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 public class XMLParser { // constructor public XMLParser() { } /** * Getting XML from URL making HTTP request * @param url string * */ public String getXmlFromUrl(String url) { String xml = null; try { // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); xml = EntityUtils.toString(httpEntity); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // return XML return xml; } /** * Getting XML DOM element * @param XML string * */ public Document getDomElement(String xml){ Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { Log.e("Error: ", e.getMessage()); return null; } catch (SAXException e) { Log.e("Error: ", e.getMessage()); return null; } catch (IOException e) { Log.e("Error: ", e.getMessage()); return null; } return doc; } /** Getting node value * @param elem element */ public final String getElementValue( Node elem ) { Node child; if( elem != null){ if (elem.hasChildNodes()){ for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){ if( child.getNodeType() == Node.TEXT_NODE ){ return child.getNodeValue(); } } } } return ""; } /** * Getting node value * @param Element node * @param key string * */ public String getValue(Element item, String str) { NodeList n = item.getElementsByTagName(str); return this.getElementValue(n.item(0)); } }
Ton code devrait ressembler à ça.
avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 InputStream xml = parser.getXmlFromUrl(URL); // getting XML from URL Document doc = parser.getDomElement(xml); // getting DOM element
Bref, passe des inputstream à ton documentbuilder, pas des Strings.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public InputStream getXmlFromUrl(String url) {....} /** * Getting XML DOM element * @param XML string * */ public Document getDomElement(InputStream xml){
j'ai changé ce que tu m'as demandé
j'ai changé aussi
mais cette fois l'application ne marche plus message erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 xml = EntityUtils.toString(httpEntity); // à xml = (InputStream) httpEntity;
The application monApp has stopped unexpectledly.please try again
l'erreur est dans :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // main InputStream xml = parser.getXmlFromUrl(URL); // getting XML from URL // getXmlFromUrl xml = (InputStream) httpEntity;
Enfin... il devrait surtout ressembler à ça:
Avec les remarques suivantes:
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 public Document getDOMFromUrl(String urlstr) throws IOException { Document document = null; InputStream is = null; URLConnection conn = null; try { URL url = new URL(urlstr); conn = url.openConnection(); is = conn.getInputStream(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(false); dbf.setIgnoringComments(false); dbf.setIgnoringElementContentWhitespace(true); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); document = db.parse(is); } catch (IOException e) { throw e; } catch (Exception e) { throw new IOExcepion("Unabled to load DOM from URL!",e); } finally { if (is != null) try { is.close(); } catch (Exception e) { Log.wtf("XMLParser","Couldn't gracefully close input-stream",e); } if (conn != null) try { conn.close(); } catch (Exception e) { Log.wtf("XMLParser","Couldn't gracefully close connection",e); } } // return DOM return document; }
* C'est la responsabilité du client d'avoir une URL conforme... laisser le client construire l'objet URL et passer l'objet URL en paramètres
* Il faut arrêter les try/catch "parce que sinon ça ne compile pas". Bien sur, du coup la fonction risque de lever une exception, et encore une fois, c'est au client de la gérer, pas à la fonction de "l'oublier".
* J'ai collé des règles par défaut à DocumentBuilder, à voir si elles correspondent aux besoins.
* La fonction doit de toute manière être appelée dans un Thread par l'UI que ce soit de manière "hard" (et ardue) ou de manière simple dans un AsyncTask.
Ah et pour finir... "monApp has stopped unexpectledly.please try again" cela veut dire qu'il y a eu une exception, cette exception est dans le logcat, et nous coller le logcat serait bien utile !
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
merci nicroman pour votre aide, malheureusement n'as pas marché , j'ai remplacé la fonction par la votre, et dans le main j'ai remplacé
l'erreur dans ce ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Document doc = parser.getDOMFromUrl(xml); // par try { doc = parser.getDOMFromUrl(xml); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 NodeList nl = doc.getElementsByTagName(KEY_ITEM);
Ce serait peut être bien que tu commence à prendre l'habitude de donner les erreur plutot que de nous laisser essayer de les deviner. On n'est pas devins et le stock de boules de cristal s'est épuisé en 2012
Oui il va nous falloir du LogCat là....
Mais encore une fois tu fais la même erreur (pourtant la gestion des exceptions est une partie primordiale, si ce n'est indispensable, de Java):
try / catch juste histoire de faire disparaitre l'erreur de compilation (et non pour la gérer), c'est toujours la mort assurée de l'application.
Du coup que se passe-t-il en cas d'exception ? Ben le programme continue sur:
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
et bim... comme doc n'est pas encore initialisé, ca crash... (NullPointerException).
Ce qu'il y a à l'interieur du try est L'ENSEMBLE de fonctions séquentielles à executer si il n'y a PAS d'exception...
D'autre part, e.printStackTrace(); c'est vraiment moche... Sous Android c'est plutot: Log.e("MONAPPLI","Erreur de récupération XML",e);
Donc un code genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 try { // on déclare "doc" ici, histoire de pas faire d'erreur d'utilisation en dehors du try Document doc = parser.getDOMFromUrl(url); // on utilise "doc".. si on est là, on a forcément un "doc" (sinon il y aurait eu une exception). NodeList nl = doc.getElements....; etc... } catch (IOException e) { Log.e("MONAPPLI","Erreur de récupération XML",e); // on peut surtout aussi coller un "Toast" ici histoire de prévenir l'utilisateur que cela n'a pas marcher. }
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
bonjour,
voici ce que donne logcat j'ai selectionné que la partie "error"
je vous remercie infiniment pour votre aide
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 01-22 09:28:18.922: E/MONAPPLI(280): Erreur de récupération XML 01-22 09:28:18.922: E/MONAPPLI(280): java.net.MalformedURLException: Protocol not found: <?xml version="1.0" encoding="iso-8859-1" ?> 01-22 09:28:18.922: E/MONAPPLI(280): <rss version="2.0"> 01-22 09:28:18.922: E/MONAPPLI(280): <channel> 01-22 09:28:18.922: E/MONAPPLI(280): <title>Abidjan.net Actualité Sport</title> 01-22 09:28:18.922: E/MONAPPLI(280): <link>http://news.abidjan.net/</link> 01-22 09:28:18.922: E/MONAPPLI(280): <description>Toute l'actualité sur l'art et la culture sur Abidjan.net</description> 01-22 09:28:18.922: E/MONAPPLI(280): <language>FR</language> 01-22 09:28:18.922: E/MONAPPLI(280): <copyright>Copyright (c) 1998-2011 Weblogy Corporation.</copyright> 01-22 09:28:18.922: E/MONAPPLI(280): <lastBuildDate>1/13/2013 4:41:23 PM</lastBuildDate> 01-22 09:28:18.922: E/MONAPPLI(280): <image> 01-22 09:28:18.922: E/MONAPPLI(280): <title>Abidjan.net</title> 01-22 09:28:18.922: E/MONAPPLI(280): <link>http://www.abidjan.net/</link> 01-22 09:28:18.922: E/MONAPPLI(280): <url>http://www.abidjan.net/rss/images/abidjan_logo.gif</url> 01-22 09:28:18.922: E/MONAPPLI(280): </image> 01-22 09:28:18.922: E/MONAPPLI(280): <item> 01-22 09:28:18.922: E/MONAPPLI(280): <title>Artisanat ivoirien : Les acteurs s’offrent une boussole</title> 01-22 09:28:18.922: E/MONAPPLI(280): <link>http://news.abidjan.net/h/448655.html</link> 01-22 09:28:18.922: E/MONAPPLI(280): <category>Le Temps</category> 01-22 09:28:18.922: E/MONAPPLI(280): <description>Les acteurs du secteur de l’artisanat ivoirien, étaient en conclave récemment à Abidjan. Durant une journée d’échanges, les participants ont fait des recommandations. Citons entre autres, le renforcement du cadre législatif et réglementaire du secteur, l’appui au développement organisationnel et institutionnel du secteur. Sans oublier, la mise en place des programmes de formation, de perfectionnement et de recyclage. A ces recommandations, il convient d’ajouter celle qui préconise la création de coopératives de crédit et le renforcement du fonds de garantie de prêts aux artisans. Informer sur les organismes et procédures de protections des œuvres artisanales et renforcer les mécanismes d’application des lois de protection. Pour mieux rentabiliser ce secteur très pourvoyeurs d’emplois, les participants ont préconisé une plus grande sensibilisation des artisans sur la nécessité et le bien fondé de la protection de leurs œuvres, du développement du commerce des produits de l’artisanat et de l’échange d’expériences. Il est également prévu la décentralisation des services de protection des œuvres artisanales. En ce qui concerne l’aspect financement qui est le nerf de la guerre, il a été souhaité la facilitation des procédures d’octroi du crédit, la simplification des formulaires à remplir et la création de produits de financement mieux adaptés aux besoins des artisans des filières identifiées 01-22 09:28:18.922: E/MONAPPLI(280): Bamba Mafoumgbé</description> 01-22 09:28:18.922: E/MONAPPLI(280): <author>Le Temps</author> 01-22 09:28:18.922: E/MONAPPLI(280): <pubDate>12 janvier 2013</pubDate> 01-22 09:28:18.922: E/MONAPPLI(280): <guid isPermaLink="false">http://news.abidjan.net/h/448655.html</guid> 01-22 09:28:18.922: E/MONAPPLI(280): </item> 01-22 09:28:18.922: E/MONAPPLI(280): <item> 01-22 09:28:18.922: E/MONAPPLI(280): <title>Réception des journalistes ex-exilés : La ministre de la Communication appelle au retour des autres confrères</title> 01-22 09:28:18.922: E/MONAPPLI(280): <link>http://news.abidjan.net/h/448651.html</link> 01-22 09:28:18.922: E/MONAPPLI(280): <category>Notre Voie</category> 01-22 09:28:18.922: E/MONAPPLI(280): <photo>http://news.abidjan.net/photos/photos/Duncan-0364.jpg</photo> 01-22 09:28:18.922: E/MONAPPLI(280): <description>Amos Beonaho, Franck Dally, Hermann Aboa, Robert Krassault, Serikpa Benson, John Jay ont été reçus, hier vendredi, par la ministre de la Communication, porte-parole adjoint du gouvernement, Mme Affoussiata Bamba-Lamine, à son cabinet sis au 22ème étage de la tour C. L’hôte a indiqué que la cérémonie s’inscrit dans le cadre de la réconciliation nationale. « … Il est important pour vous et pour nous tous que vous soyez retournés au bercail. On est heureux que chez soi, car ce retour participe de votre épanouissement personnel. La réconciliation doit commencer par les autorités. Nous avons un fort désir de vous voir réconciliés avec vos frères », a-t-elle dit à ses hôtes. Avant de lancer un appel aux journalistes encore en exil : « Nous lançons un appel aux autres journalistes encore en exil de suivre votre voie. Car on ne peut avoir de paix et de sécurité que chez soi. C’est nous qui devons tout faire pour que la Côte d’Ivoire se reconstruise », a-t-elle relevé. Par ailleurs, la ministre a souligné que le président de l’Union nationale des journalistes de Côte d’Ivoire (Unjci), Traoré Moussa Ahmed dit M.T., doit être encouragé dans sa tâche d’aider au retour d’exil des journalistes. Car, pour elle, aucun journaliste ne doit vivre hors du pays. « Au-delà 01-22 09:28:18.952: E/AndroidRuntime(280): FATAL EXCEPTION: main 01-22 09:28:18.952: E/AndroidRuntime(280): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.weblogy.abidjan/com.weblogy.abidjan.MainActivity}: java.lang.NullPointerException 01-22 09:28:18.952: E/AndroidRuntime(280): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 01-22 09:28:18.952: E/AndroidRuntime(280): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 01-22 09:28:18.952: E/AndroidRuntime(280): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 01-22 09:28:18.952: E/AndroidRuntime(280): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 01-22 09:28:18.952: E/AndroidRuntime(280): at android.os.Handler.dispatchMessage(Handler.java:99) 01-22 09:28:18.952: E/AndroidRuntime(280): at android.os.Looper.loop(Looper.java:123) 01-22 09:28:18.952: E/AndroidRuntime(280): at android.app.ActivityThread.main(ActivityThread.java:4627) 01-22 09:28:18.952: E/AndroidRuntime(280): at java.lang.reflect.Method.invokeNative(Native Method) 01-22 09:28:18.952: E/AndroidRuntime(280): at java.lang.reflect.Method.invoke(Method.java:521) 01-22 09:28:18.952: E/AndroidRuntime(280): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 01-22 09:28:18.952: E/AndroidRuntime(280): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 01-22 09:28:18.952: E/AndroidRuntime(280): at dalvik.system.NativeStart.main(Native Method) 01-22 09:28:18.952: E/AndroidRuntime(280): Caused by: java.lang.NullPointerException 01-22 09:28:18.952: E/AndroidRuntime(280): at com.weblogy.abidjan.MainActivity.onCreate(MainActivity.java:47) 01-22 09:28:18.952: E/AndroidRuntime(280): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 01-22 09:28:18.952: E/AndroidRuntime(280): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 01-22 09:28:18.952: E/AndroidRuntime(280): ... 11 more
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager