Hari ini saya akan membahas tentang parsing XML di android menggunakan
DOM parser. Juga saya menunjukkan cara memperbarui ListView
dengan data XML parsing.
truktur XML
Dalam tutorial ini saya akan akan parsing
file XML berikut. Anda bisa mendapatkan file xml ini dengan
mengakses http://api.androidhive.info/pizza/?format=xml
<?xml version="1.0" encoding="UTF-8"?>
<menu>
<item>
<id>1</id>
<name>Margherita</name>
<cost>155</cost>
<description>Single
cheese topping</description>
</item>
<item>
<id>2</id>
<name>Double Cheese
Margherita</name>
<cost>225</cost>
<description>Loaded
with Extra Cheese</description>
</item>
<item>
<id>3</id>
<name>Fresh
Veggie</name>
<cost>110</cost>
<description>Oninon
and Crisp capsicum</description>
</item>
<item>
<id>4</id>
<name>Peppy
Paneer</name>
<cost>155</cost>
<description>Paneer,
Crisp capsicum and Red pepper</description>
</item>
<item>
<id>5</id>
<name>Mexican Green
Wave</name>
<cost>445</cost>
<description>Onion,
Crip capsicum, Tomato with mexican herb</description>
</item>
</menu>
|
Menulis XML Parser Kelas
Dalam proyek Anda membuat file kelas dan
nama itu sebagai XMLParser.java. Kelas parser terutama berkaitan operasi berikut.
⇒ Mendapatkan konten XML dengan membuat permintaan HTTP
⇒ Parsing konten XML dan mendapatkan elemen DOM dari xml.
⇒ Dapatkan setiap xml nilai elemen anak dengan melewati elemen nama node.
⇒ Parsing konten XML dan mendapatkan elemen DOM dari xml.
⇒ Dapatkan setiap xml nilai elemen anak dengan melewati elemen nama node.
Mendapatkan konten XML dengan membuat HTTP
Request
Fungsi ini akan mendapatkan XML dengan
membuat Permintaan HTTP.
public String
getXmlFromUrl(String url) {
String xml = null;
try {
//
defaultHttpClient
DefaultHttpClient
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;
}
|
Parsing XML konten dan mendapatkan elemen
DOM
Setelah mendapatkan konten XML kita
perlu mendapatkan elemen DOM dari file XML. Di bawah fungsi akan mengurai
isi XML dan akan memberikan elemen 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;
}
|
Dapatkan setiap nilai elemen anak xml
dengan melewati elemen nama node
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 "";
}
|
Pemakaian
Berikut adalah potongan kode untuk
menangani operasi xml. Saya menggunakan xml kelas parser sejauh ini kami
dibangun dan perulangan melalui setiap elemen xml dan mendapatkan data anak.
// All static variables
// XML node keys
static final String KEY_ITEM =
"item"; // parent node
static final String KEY_NAME =
"name";
static final String KEY_COST =
"cost";
static final String KEY_DESC =
"description";
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
// looping through all item nodes
<item>
for (int i = 0; i < nl.getLength(); i++)
{
String name = parser.getValue(e, KEY_NAME); //
name child value
String cost = parser.getValue(e, KEY_COST); //
cost child value
String description = parser.getValue(e,
KEY_DESC); // description child value
}
|
Parsing data XML dan memperbarui ke
ListView
Dalam tutorial saya sebelumnya Android
ListView Tutorial saya menjelaskan cara membuat
ListView dan memperbarui dengan data daftar. Di bawah ini saya menerapkan
ListView yang sama namun daftar data yang saya memperbarui adalah dari xml
parsing. ListView ini memiliki beberapa sub teks seperti nama, biaya dan
deskripsi.
public class AndroidXMLParsingActivity extends ListActivity {
// All static variables
// XML node keys
static final String KEY_ITEM = "item"; // parent node
static final String KEY_ID = "id";
static final String KEY_NAME = "name";
static final String KEY_COST = "cost";
static final String KEY_DESC = "description";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<HashMap<String,
String>> menuItems = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml =
parser.getXmlFromUrl(URL); // getting XML
Document doc =
parser.getDomElement(xml); // getting DOM element
NodeList nl =
doc.getElementsByTagName(KEY_ITEM);
// looping through all
item nodes <item>
for (int i = 0; i < nl.getLength(); i++) {
//
creating new HashMap
HashMap<String,
String> map = new HashMap<String,
String>();
Element
e = (Element) nl.item(i);
//
adding each child node to HashMap key => value
map.put(KEY_ID,
parser.getValue(e, KEY_ID));
map.put(KEY_NAME,
parser.getValue(e, KEY_NAME));
map.put(KEY_COST,
"Rs." +
parser.getValue(e, KEY_COST));
map.put(KEY_DESC,
parser.getValue(e, KEY_DESC));
//
adding HashList to ArrayList
menuItems.add(map);
}
// Adding menuItems to
ListView
ListAdapter adapter = new SimpleAdapter(this, menuItems,
R.layout.list_item,
new String[] { KEY_NAME, KEY_DESC,
KEY_COST }, new int[] {
R.id.name,
R.id.desciption, R.id.cost });
setListAdapter(adapter);
// selecting single
ListView item
ListView lv =
getListView();
//
listening to single listitem click
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//
getting values from selected ListItem
String
name = ((TextView) view.findViewById(R.id.name)).getText().toString();
String
cost = ((TextView) view.findViewById(R.id.cost)).getText().toString();
String
description = ((TextView)
view.findViewById(R.id.desciption)).getText().toString();
//
Starting new intent
Intent
in = new Intent(getApplicationContext(),
SingleMenuItemActivity.class);
in.putExtra(KEY_NAME,
name);
in.putExtra(KEY_COST,
cost);
in.putExtra(KEY_DESC,
description);
startActivity(in);
}
});
}
}
|
selanjutnya coba test aplikasi di smartphone android anda