Bonjour, j'ai une méthode qui exécute une URL et qui en récupère le contenu généré au format XML (fichier PHP générant ce fichier).
Lorsqu'il y a le symbole "<" dans le contenu récupéré, l'application me sort une erreur "ParseException".
Voilà à quoi ressemble le code source XML récupéré lorsqu'il y a ce fameux symbole :
Le caractère qui fait tout planter est le "<" (celui en rouge) du champs name de la rule 16.
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 <?xml version='1.0' encoding='UTF-8'?><rules> <rule> <id>1</id> <name>rtg</name> <description>fut</description> </rule> <rule> <id>3</id> <name>aé!€</name> <description>aé!€</description> </rule> <rule> <id>16</id> <name><01234567890123456789012345678901234567890123456789012345678901234</name> <description>ztué,\') nkg¥~\\[§>{:}=|¹~#{[|`\^@]o:P)(%54 ^¤¤</description> </rule> </rules>
Je précise qu'il s'agit de valeurs de test.
Voilà également la façon dont je récupère ce contenu :
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 public ArrayList<freeman.objects.Rules> parseRules(String url) throws MalformedURLException, IOException, NullPointerException, XmlPullParserException{ ArrayList<freeman.objects.Rules> listeRules = null; XmlPullParser parser = Xml.newPullParser(); try { // auto-detect the encoding from the stream parser.setInput(this.getInputStream(url), null); int eventType = parser.getEventType(); freeman.objects.Rules currentRule = null; boolean done = false; while (eventType != XmlPullParser.END_DOCUMENT && !done){ String name = null; switch (eventType){ // Dans le cas où l'on commence le document XML case XmlPullParser.START_DOCUMENT: listeRules = new ArrayList<freeman.objects.Rules>(); break; // Dans le cas où l'on commence une balise case XmlPullParser.START_TAG: name = parser.getName(); if (name.equalsIgnoreCase(RULE)){ currentRule = new freeman.objects.Rules(); }else if(currentRule != null){ if(name.equalsIgnoreCase(ID)){ currentRule.setId(Integer.parseInt(parser.nextText())); }else if (name.equalsIgnoreCase(NAME)){ //currentRule.setName(String.valueOf(Html.fromHtml(parser.nextText()))); currentRule.setName(parser.nextText()); }else if(name.equalsIgnoreCase(DESCRIPTION)){ //currentRule.setDescription(String.valueOf(Html.fromHtml(parser.nextText()))); currentRule.setDescription(parser.nextText()); } } break; // Dans le cas où l'on termine une balise case XmlPullParser.END_TAG: name = parser.getName(); if (name.equalsIgnoreCase(RULE) && currentRule != null){ listeRules.add(currentRule); }else if (name.equalsIgnoreCase(RULES)){ done = true; } break; } eventType = parser.next(); } } catch (MalformedURLException e) { throw e; } catch (IOException e) { throw e; } catch (NullPointerException e) { throw e; } catch (XmlPullParserException e) { throw e; } return listeRules; }En me renseignant sur internet, j'ai vu un peu de tout, c'est à dire que je peux utiliser la méthode HTML.fromHTML() mais ça ne change rien.
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 private InputStream getInputStream(String strUrl) throws MalformedURLException, IOException, NullPointerException { InputStream res=null; try { URL url = new URL(strUrl); res = url.openConnection().getInputStream(); } catch (MalformedURLException e) { throw e; } catch (IOException e) { throw e; } if (res == null){ res = new ByteArrayInputStream("<rules></rules>".getBytes()); } return res; }
J'ai également essayé en formatant tout les caractères spéciaux avec leur code HTML mais sans succès, du coup, je suis perdu..
Partager