Parser un XML sous Android
Dans ce tuto, notre vue traitera principalement les opérations suivantes pour parser un flux XML simple.
sa reste que l'executer
- Obtenir contenu XML en faisant requête HTTP
- Analyse de contenu XML et obtenir l'élément DOM de XML.
- Obtenir la valeur de chaque élément enfant xml en passant le nom de noeud.
package com.example.EPIXmlDemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.Toast;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.*;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import javax.xml.parsers.*;
public class MyActivity extends Activity {
/**
* Called when the activity is first created.
*/
// All static variables
static final String URL = "http://yasminemarket.com/Sitemap.xml.aspx";
// XML node keys
static final String KEY_ITEM = "url";
static final String KEY_TITLE = "loc";
static final String KEY_AUTHOR = "lastmod";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Faire fonctionner cette activité sur une version SDK < 9
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
/*new Thread(new Runnable() {
public void run() {
parseRssFeed();
}
}).start();*/
parseRssFeed();
}
public void parseRssFeed()
{
String xml = getXmlFromUrl(URL);
Document doc = getDomElement(xml);
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
for (int i = 0; i < nl.getLength(); i++) {
Element e = (Element) nl.item(i);
String name = getValue(e, KEY_TITLE);
String description = getValue(e, KEY_AUTHOR);
Log.d("AMINE",name + ": " + description);
Toast.makeText(this, name + ": " + description, 3000).show();
}
}
//Obtenir le contenu XML en faisant requête HTTP
public String getXmlFromUrl(String url) {
String xml = null;
try {
HttpClient 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;
}
//L'analyse du contenu XML et obtenir l'élément DOM
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 DOM
return doc;
}
//Localiser la valeur d'un noeud en poassant son nom
public String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return this.getElementValue(n.item(0));
}
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 "";
}
}
sa reste que l'executer

Comments