Doel Posté(e) 29 novembre 2010 Share Posté(e) 29 novembre 2010 Bonjour, petite présentation, Doel, 24 ans, développeur web + connaissances en C, C++, Java. Vu que je n'ai pas grand chose à faire en ce moment, j'ai commencé à développer une petite application pour mon expérience personnelle. Il s'agit d'un simple reader XML d'articles. le fichier XML est placé sur un serveur web a une adresse quelconque. Le XML que je dois lire est sous cette forme : <edition> <article id="10" lang="fr"> <titre> article 10 </titre> <texte> texte de l'article 10 <br/> avec du html </texte> <date> Mercredi, 17 novembre </date> </article> </edition> Apres quelques recherches, j'ai pu trouver un parser XML qui me satisfait, sauf que mon probleme arrive lorsqu'il s'agit de récuperer le texte de l'article. Ce texte peut en effet contenir du html, des balises simples telles que <br/>, <strong></strong>, etc ... Hors le parser s'arrete à la premiere balise "<". Ainsi ma variable recuperée sera "texte de l'article 10 " au lieu de "texte de l'article 10 <br/> avec du html" J'ai essayé en mettant du <![CDATA[texte]]>, et pour le coup ba la variable ne contient plus que "<". Je vous fourni le code du parser. import java.util.ArrayList; import java.util.HashMap; import org.xml.sax.Attributes; import org.xml.sax.SAXException; public class Articles extends MyHandler { private String _tempId = null; private String _tempTitle = null; private String _tempLongdesc = null; private String _tempDate = null; private int _id = 0; private static String _keyword = "dev_web"; private static String _params = "?keyword="; public Articles() { super(_params + _keyword); } public Articles(String key) { super(_params + key); _keyword = key; } public Articles(int id) { super("?article="+id); _id = id; } public HashMap<String, String> getArticle() { return (_array.size() > 0) ? _array.get(0) : null; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { currentElement = true; if(localName.equals("article")) { _tempId = attributes.getValue("id"); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { currentElement = false; if(localName.equals("titre")) _tempTitle = currentValue; else if(localName.equals("texte")) _tempLongdesc = currentValue; else if(localName.equals("date")) _tempDate = currentValue; else if(localName.equals("article")) { if((_tempTitle != null) && (_tempLongdesc != null) && (_tempDate != null)) { _map = new HashMap<String, String>(); _map.put("id", _tempId); _map.put("title", _tempTitle); _map.put("longdesc", _tempLongdesc); _map.put("date", _tempDate); _array.add(_map); } _tempId = null; _tempTitle = null; _tempLongdesc = null; _tempDate = null; } } } Merci à ceux qui tenteront de m'aider. Cordialement Lien vers le commentaire Partager sur d’autres sites More sharing options...
arnouf Posté(e) 29 novembre 2010 Share Posté(e) 29 novembre 2010 Bonjour, petite présentation, Doel, 24 ans, développeur web + connaissances en C, C++, Java. Vu que je n'ai pas grand chose à faire en ce moment, j'ai commencé à développer une petite application pour mon expérience personnelle. Il s'agit d'un simple reader XML d'articles. le fichier XML est placé sur un serveur web a une adresse quelconque. Le XML que je dois lire est sous cette forme : <edition> <article id="10" lang="fr"> <titre> article 10 </titre> <texte> texte de l'article 10 <br/> avec du html </texte> <date> Mercredi, 17 novembre </date> </article> </edition> Apres quelques recherches, j'ai pu trouver un parser XML qui me satisfait, sauf que mon probleme arrive lorsqu'il s'agit de récuperer le texte de l'article. Ce texte peut en effet contenir du html, des balises simples telles que <br/>, <strong></strong>, etc ... Hors le parser s'arrete à la premiere balise "<". Ainsi ma variable recuperée sera "texte de l'article 10 " au lieu de "texte de l'article 10 <br/> avec du html" J'ai essayé en mettant du <![CDATA[texte]]>, et pour le coup ba la variable ne contient plus que "<". Je vous fourni le code du parser. import java.util.ArrayList; import java.util.HashMap; import org.xml.sax.Attributes; import org.xml.sax.SAXException; public class Articles extends MyHandler { private String _tempId = null; private String _tempTitle = null; private String _tempLongdesc = null; private String _tempDate = null; private int _id = 0; private static String _keyword = "dev_web"; private static String _params = "?keyword="; public Articles() { super(_params + _keyword); } public Articles(String key) { super(_params + key); _keyword = key; } public Articles(int id) { super("?article="+id); _id = id; } public HashMap<String, String> getArticle() { return (_array.size() > 0) ? _array.get(0) : null; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { currentElement = true; if(localName.equals("article")) { _tempId = attributes.getValue("id"); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { currentElement = false; if(localName.equals("titre")) _tempTitle = currentValue; else if(localName.equals("texte")) _tempLongdesc = currentValue; else if(localName.equals("date")) _tempDate = currentValue; else if(localName.equals("article")) { if((_tempTitle != null) && (_tempLongdesc != null) && (_tempDate != null)) { _map = new HashMap<String, String>(); _map.put("id", _tempId); _map.put("title", _tempTitle); _map.put("longdesc", _tempLongdesc); _map.put("date", _tempDate); _array.add(_map); } _tempId = null; _tempTitle = null; _tempLongdesc = null; _tempDate = null; } } } Merci à ceux qui tenteront de m'aider. Cordialement Eventuellement encode ta chaine avant de la parser en utilisant le Html.encode... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Doel Posté(e) 30 novembre 2010 Auteur Share Posté(e) 30 novembre 2010 Bonjour, Merci de votre réponse. Je pense que vous devez parler de la méthode htmlEncode de la classe TextUtils ? Je ne sais pas trop ou l'utiliser ? dans la methode de mon activity où est parsé le xml ? dans ce cas le htmlEncode va s'appliquer a tout le XML ? Si dessous une partie du code du onCreate de l'activity concernée : SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); Articles XmlArticles = new Articles(_articleId); xr.setContentHandler(XmlArticles); xr.parse(new InputSource(Articles.getUrl().openStream())); final HashMap<String, String> article = XmlArticles.getArticle(); content = article.get("longdesc"); webContent.append("<html><body><p>"); webContent.append(content); webContent.append("</p></body></html>"); myWebView.loadData(webContent.toString(), "text/html", "utf-8"); Une autre solution que j'applique pour l'instant c'est de remplacer dans le XML les < et les > par d'autres caracteres ([H- et -H] en l'occurence), puis de remplacer de nouveau ces caractere par des < et des >, mais il doit y avoir une solution plus optimisée ? Cordialement Lien vers le commentaire Partager sur d’autres sites More sharing options...
arnouf Posté(e) 30 novembre 2010 Share Posté(e) 30 novembre 2010 Bonjour, Merci de votre réponse. Je pense que vous devez parler de la méthode htmlEncode de la classe TextUtils ? Je ne sais pas trop ou l'utiliser ? dans la methode de mon activity où est parsé le xml ? dans ce cas le htmlEncode va s'appliquer a tout le XML ? Si dessous une partie du code du onCreate de l'activity concernée : SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); Articles XmlArticles = new Articles(_articleId); xr.setContentHandler(XmlArticles); xr.parse(new InputSource(Articles.getUrl().openStream())); final HashMap<String, String> article = XmlArticles.getArticle(); content = article.get("longdesc"); webContent.append("<html><body><p>"); webContent.append(content); webContent.append("</p></body></html>"); myWebView.loadData(webContent.toString(), "text/html", "utf-8"); Une autre solution que j'applique pour l'instant c'est de remplacer dans le XML les < et les > par d'autres caracteres ([H- et -H] en l'occurence), puis de remplacer de nouveau ces caractere par des < et des >, mais il doit y avoir une solution plus optimisée ? Cordialement ==> webContent.append(TextUtils.htmlEncode(content)); // sinon je crois bien qu'il y a une classe Html. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Doel Posté(e) 30 novembre 2010 Auteur Share Posté(e) 30 novembre 2010 merci, mais le probleme semble survenir avant. A cette étape la variable contient une chaine de caractere qui va du début du noeud XML jusqu'au premier < Lien vers le commentaire Partager sur d’autres sites More sharing options...
moritan Posté(e) 30 novembre 2010 Share Posté(e) 30 novembre 2010 si tu as du html directement dans ton xml, c'est mort ton xml est corrompu. il faut que ton html soit dans une balise CDATA Message envoyé avec l'application Forum FrAndroid Lien vers le commentaire Partager sur d’autres sites More sharing options...
Doel Posté(e) 1 décembre 2010 Auteur Share Posté(e) 1 décembre 2010 bonjour, Quand j'utilise le CDATA, pour transformer le xml (en php donc, avant que android ne l'utilise), je me retrouve avec ca : <edition> <article id="10" lang="fr"> <titre> article 10 </titre> <texte> <![CDATA[texte de l'article 10 <br/> avec du html]]> </texte> <date> Mercredi, 17 novembre </date> </article> </edition> et dans ce cas, la variable "content" du java ne contient plus que un "<" Cordialement Lien vers le commentaire Partager sur d’autres sites More sharing options...
buho29 Posté(e) 2 décembre 2010 Share Posté(e) 2 décembre 2010 bonjour, Quand j'utilise le CDATA, pour transformer le xml (en php donc, avant que android ne l'utilise), je me retrouve avec ca : <edition> <article id="10" lang="fr"> <titre> article 10 </titre> <texte> <![CDATA[texte de l'article 10 <br/> avec du html]]> </texte> <date> Mercredi, 17 novembre </date> </article> </edition> et dans ce cas, la variable "content" du java ne contient plus que un "<" Cordialement je viens d'avoir le même le problème avec SAX plan B utilise XmlPullParser , marche direct lie avec ou sans cdata (getText()) a++ Lien vers le commentaire Partager sur d’autres sites More sharing options...
mokbir Posté(e) 27 décembre 2010 Share Posté(e) 27 décembre 2010 je viens d'avoir le même le problème avec SAX plan B utilise XmlPullParser , marche direct lie avec ou sans cdata (getText()) a++ Bonjour, Esperant que vous avez trouvé une solution, mais à mon avis ce n'est pas un problème lié au Framework, mais c'est par rapport à la logique XML. Il faut effectivement trouver un moyen de bien parser (voire même encapsuler) votre structure xml. Alors pourquoi ne pas implemanter votre DTD.!!! Comme ça vous serez à l'aise.Je pense Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.