Doel Posted November 29, 2010 Share Posted November 29, 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 Link to comment Share on other sites More sharing options...
arnouf Posted November 29, 2010 Share Posted November 29, 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... Link to comment Share on other sites More sharing options...
Doel Posted November 30, 2010 Author Share Posted November 30, 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 Link to comment Share on other sites More sharing options...
arnouf Posted November 30, 2010 Share Posted November 30, 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. Link to comment Share on other sites More sharing options...
Doel Posted November 30, 2010 Author Share Posted November 30, 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 < Link to comment Share on other sites More sharing options...
moritan Posted November 30, 2010 Share Posted November 30, 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 Link to comment Share on other sites More sharing options...
Doel Posted December 1, 2010 Author Share Posted December 1, 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 Link to comment Share on other sites More sharing options...
buho29 Posted December 2, 2010 Share Posted December 2, 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++ Link to comment Share on other sites More sharing options...
mokbir Posted December 27, 2010 Share Posted December 27, 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 Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.