Aller au contenu

[Problème] parser XML avec du HTML dedans


Doel

Recommended Posts

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

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

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

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

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

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

  • 4 weeks later...

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...