I have My Rss File Items :
<item >
<title>Prasad</title>
<link>http://www.tele.com/rssHostDescr.php?hostId=15</link>
<guid isPermaLink="false">http://www.tele.com/rssHostDescr.php?hostId=14</guid>
<pubDate>2013-04-10</pubDate>
<description>Prasad</description>
<media:thumbnail width='66' height='49' url='http://www.tele.com/hos/Panthi-image.jpg'></media:thumbnail>
</item>
<item>
........................
</item>
etc.....................
I'm trying to parse the above file,I'm able to get all the information(title,link,date)but my requirement is to get url attribute value. How do I get the URL value from media:thumbnail tag? Could any one help?
Here's my code:
public class AndroidXMLParsingActivity extends ListActivity {
// All static variables
static final String URL = "http://www.tele.com/RSSFeed/toriHos.php";
// XML node keys
static final String KEY_ITEM = "item"; // parent node
static final String KEY_TITLE= "title";
static final String KEY_LINK = "link";
static final String KEY_PUBDATE = "pubDate";
static final String KEY_MEDIA = "media:thumbnail";
#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);
NodeList n=doc.getElementsByTagName(KEY_MEDIA);
// 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_TITLE, parser.getValue(e, KEY_TITLE));
map.put(KEY_LINK, parser.getValue(e, KEY_LINK));
map.put(KEY_PUBDATE, parser.getValue(e, KEY_PUBDATE));
map.put(KEY_MEDIA, parser.getValue(e, KEY_MEDIA));//Here I'm not getting any value
// adding HashList to ArrayList
menuItems.add(map);
}
}
}
Note:map.put(KEY_MEDIA, parser.getValue(e, KEY_MEDIA));//Here I'm not getting any value
Element e = (Element) nl.item(i);
String urlStr = e.getAttribute("url");
Hope this will help you.
Related
I wanna ask something about android programming..
I create a class that return display from rss xml file to android but i get some error
04-08 14:37:19.162: E/AndroidRuntime(381):
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.xmlreader/com.example.xmlreader.MainActivity}:
java.lang.NullPointerException
Code:
static final String URL = "http://api.androidhive.info/pizza/?format=xml";
// 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.activity_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.getDomElem(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();
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(), SingleActivity.class);
in.putExtra(KEY_NAME, name);
in.putExtra(KEY_COST, cost);
in.putExtra(KEY_DESC, description);
startActivity(in);
}
});
}
the error in line 38 or line i was give (*) this mark...
pleas help me...
If the nullpointer is coming up on below line (with *):
(*) NodeList nl = doc.getElementsByTagName(KEY_ITEM); //i reckon the nullpointer is coming up on the doc object...
Then I reckon to check whether the xml which is being retrieved from the getXMLFromURL method
is correct?:
XMLParser parser = new XMLParser();
String xml = parser.getXMLFromURL(URL); // getting XML (Is this correctly retreived?
Document doc = parser.getDomElem(xml); // getting DOM element (This is returning null)
For more help share your XMLParser class
You need to use a Thread or AsyncTask to perform the "Networking Operations". Otherwise you will get NetworkOnMainThreadException. read this
Add permission to AndroidManifest.xml.
<uses-permission android:name="android.permission.INTERNET"/>
An example using a Thread
menuItems = new ArrayList<HashMap<String, String>>();
final XMLParser parser = new XMLParser();
Thread th = new Thread(new Runnable() {
#Override
public void run() {
xml = parser.getXmlFromUrl(URL);
handler.post(new Runnable() { //create an object of Handler class in onCreate() - (android.os.Handler)
#Override
public void run() {
Document doc = parser.getDomElement(xml);
nl =doc.getElementsByTagName(KEY_ITEM);
//other code inside onCreate() - for loop
}
});
}
}
th.start();
SimpleAdapter adapter = new SimpleAdapter(this, menuItems, R.layout.list_item,
new String[]{KEY_NAME, KEY_COST, KEY_DESCRIPTION}, new int[]{R.id.name, R.id.cost, R.id.description});
setListAdapter(adapter);
This question already has an answer here:
Closed 10 years ago.
Possible Duplicate:
how to get specific value in xml parsing by write in edittext
This code does not compile whats wrong in this code? Is not say application stop unexpectedly did I do correctly everything? Please check it I want to add an EditText which take input and check its value from XML file and show on screen I followed this Tutorial
static final String URL = "http://api.androidhive.info/pizza/?format=xml";
// 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);
EditText et = (EditText)findViewById(R.id.editText1);
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
if(parser.getValue(e, KEY_ID).equals(et.getText().toString())){
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);
}
});
}
}
main.xml file-->>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<!-- Main ListView
Always give id value as list(#android:id/list)
-->
<ListView
android:id="#android:id/list"
android:layout_width="fill_parent"
android:layout_height="596dp" />
<EditText
android:id="#+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
try this code,
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText et = (EditText)findViewById(R.id.editText1);
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
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
if(parser.getValue(e, KEY_ID).equals(et.getText().toString())){
String name = parser.getValue(e, KEY_NAME);
String cost = "Rs." + parser.getValue(e, KEY_COST);
String description = parser.getValue(e, KEY_DESC);
Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
in.putExtra(KEY_NAME, name);
in.putExtra(KEY_COST, cost);
in.putExtra(KEY_DESC, description);
startActivity(in);
}
}
}
and in the SingleMenuItemActivity class, fetch the values using,
String name = this.getIntent().getStringExtra("KEY_NAME");
String cost= this.getIntent().getStringExtra("KEY_NAME");
String description= this.getIntent().getStringExtra("KEY_DESC");
Edit-
main.xml file-->>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<EditText
android:id="#+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" />
</LinearLayout>
Extend your Activity from the Activity class
Your layout.xml is not properly formed:
<EditText
android:id="#+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
You need to properly end the <EditText> tag with /> like this:
<EditText
android:id="#+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" />
I have a big xml file(Around 100+ Items), how do you filter the download according to "String KEY_ID = "id";" in an XML? Below is the sample of my XML code. Example, I want to list out the item "String KEY_ID = "id";" from 1 - 20 to show in my gridview. My objective is to limit the xmlparsing. Currently my codes just downloads everything in my xml and shows them in gridview.
myXML.xml
<song>
<id>1</id>
<title>1</title>
<artist>Blabla</artist>
<duration>0</duration>
<thumb_url>https://jpg</thumb_url>
<big_url>https://jpg</big_url>
</song>
<song>
<id>2</id>
<title>2</title>
<artist>Nature</artist>
<duration>0</duration>
<thumb_url>https://jpg</thumb_url>
<big_url>https://jpg</big_url>
</song>
<song>
<id>3</id>
<title>3</title>
<artist>Nature</artist>
<duration>0</duration>
<thumb_url>https://jpg</thumb_url>
<big_url>https://jpg</big_url>
</song>
</music>
MainGridView.class
public class MainGridView extends Activity {
private ProgressDialog pDialog;
ArrayList<HashMap<String, String>> songsList;
static final String KEY_SONG = "song";
static final String KEY_ID = "id";
static final String KEY_TITLE = "title";
static final String KEY_ARTIST = "artist";
static final String KEY_CAT_ARTIST = "artistcat";
static final String KEY_DURATION = "duration";
static final String KEY_THUMB_URL = "thumb_url";
static final String KEY_BIG_URL = "big_url";
static final String KEY_CAT_URL = "cat_url";
static String IMAGE_POSITION;
GridView grid;
MainGridViewLazyAdapter adapter;
String cat_url;
String artist_url;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gridview_main);
new loadGridView().execute();
grid = (GridView) findViewById(R.id.grid_view);
public class loadGridView extends AsyncTask<Integer, String, String> {
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainGridView.this);
pDialog.setTitle("Connect to Server");
pDialog.setMessage("This process can take a few seconds to a few minutes, depending on your Internet Connection Speed.");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
#Override
protected String doInBackground(Integer... args) {
// updating UI from Background Thread
Intent in = getIntent();
songsList = new ArrayList<HashMap<String, String>>();
cat_url = in.getStringExtra(KEY_CAT_URL);
artist_url = in.getStringExtra(KEY_CAT_ARTIST);
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(cat_url); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_SONG);
// looping through all song nodes <song>
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_TITLE, parser.getValue(e, KEY_TITLE));
map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));
map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
map.put(KEY_BIG_URL, parser.getValue(e, KEY_BIG_URL));
// adding HashList to ArrayList
songsList.add(map);
}
return null;
}
#Override
protected void onPostExecute(String args) {
adapter=new MainGridViewLazyAdapter(MainGridView.this, songsList);
grid.setAdapter(adapter);
pDialog.dismiss();
}
}
XML parsing is actually usually pretty fast (faster than JSON in some phones). But to display just some of the document you might want to look into XPath (java.xml.xpath) - e.g.:
/music/song[id <= 20]
See http://developer.android.com/reference/javax/xml/xpath/package-summary.html
Hi i wrote one xml parsing example.here i have to get the data information from mysql database and display it in android emulator successfully.
this is my code:
public class CustomizedListView extends Activity {
// All static variables
static final String URL = "http://192.168.1.168/xcart432pro/orderdetails.xml";
// XML node keys
static final String KEY_SONG = "Order"; // parent node
static final String KEY_ID = "orderid";
static final String KEY_TITLE = "orderid";
static final String KEY_ARTIST = "payment_method";
static final String KEY_DURATION = "total";
ListView list;
LazyAdapter adapter;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_SONG);
// looping through all song nodes <song>
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_TITLE, parser.getValue(e, KEY_TITLE));
map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));
map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
// adding HashList to ArrayList
songsList.add(map);
}
list=(ListView)findViewById(R.id.list);
// Getting adapter by passing xml data ArrayList
adapter=new LazyAdapter(this, songsList);
list.setAdapter(adapter);
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String Orderid= ((TextView) view.findViewById(R.id.title)).getText().toString();
String Price = ((TextView) view.findViewById(R.id.duration)).getText().toString();
String Description = ((TextView) view.findViewById(R.id.artist)).getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
in.putExtra(KEY_TITLE, Orderid);
in.putExtra(KEY_DURATION, Price);
in.putExtra(KEY_ARTIST, Description);
startActivity(in);
}
});
}
}
dis is my singlemenuitem.java class is:
public class SingleMenuItemActivity extends Activity {
// XML node keys
static final String KEY_TITLE = "orderid";
static final String KEY_ARTIST = "payment_method";
static final String KEY_DURATION = "total";
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.single_list_item);
// getting intent data
Intent in = getIntent();
// Get XML values from previous intent
String product = in.getStringExtra(KEY_DURATION);
String login = in.getStringExtra(KEY_TITLE);
String description = in.getStringExtra(KEY_ARTIST);
// Displaying all values on the screen
TextView lblName = (TextView) findViewById(R.id.name_label);
TextView lblPName = (TextView) findViewById(R.id.cost_label);
TextView lblDesc = (TextView) findViewById(R.id.description_label);
lblName.setText(login);
lblPName.setText(product);
lblDesc.setText(description);
}
}
Here i have to successfully displayed on android emulator.
but i wish to display on first page orderid and payment_method only.then it is move to next page means have to display total for that particular id.please give me solutions.how can i to do.i wish to my output is :
if i clicked 13 means that particular order total only displayed on next activity.
How is to do.please help me.
i got the answer.if u need hide the "description" field by adding andorid:visibility="gone" to description label in your xml file. So that the description filed will be present in listview but it won't be visible.
Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
in.putExtra("KEY_TITLE", Orderid);
in.putExtra("KEY_DURATION", Price);
in.putExtra("KEY_ARTIST", Description);
startActivity(in);
singlemenuitem.java
product = getIntent().getExtras().getString("KEY_TITLE");
login = getIntent().getExtras().getString("KEY_DURATION");
description = getIntent().getExtras().getInt("KEY_ARTIST");
Im parsing an xml file and i keep getting a nullpointer exception. I don't know here the null pointer is :(
ListView.java
static String URL = "https://dl.dropbox.com/u/####/wosm-library-EN.xml";
static final String KEY_ITEM = "item";
static final String KEY_ID = "id";
static final String KEY_TITLE = "title";
static final String KEY_DESCRIPTION = "description";
static final String KEY_FILESIZE = "filesize";
static final String KEY_THUMB_URL = "thumb_url";
static final String KEY_DOCUMENT_URL = "document_url";
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
ListView list;
LazyAdapter adapter;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.library);
sharedPrefs.getBoolean("french", false); {
URL="https://dl.dropbox.com/u/######/wosm-library-EN.xml";
}
sharedPrefs.getBoolean("french", true);
{
URL="https://dl.dropbox.com/u/######/wosm-library-FR.xml";
}
ArrayList<HashMap<String, String>> libraryList = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL);
Document doc = parser.getDomElement(xml);
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
for (int i = 0; i < nl.getLength(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
map.put(KEY_ID, parser.getValue(e, KEY_ID));
map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
map.put(KEY_DESCRIPTION, parser.getValue(e, KEY_DESCRIPTION));
map.put(KEY_FILESIZE, parser.getValue(e, KEY_FILESIZE));
map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
map.put(KEY_DOCUMENT_URL, parser.getValue(e, KEY_DOCUMENT_URL));
libraryList.add(map);
}
list=(ListView)findViewById(R.id.list);
adapter=new LazyAdapter(this, libraryList);
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String title = ((TextView) view.findViewById(R.id.title)).getText().toString();
String description = ((TextView) view.findViewById(R.id.artist)).getText().toString();
//String thumb_url = ((ImageView)view.findViewById(R.id.list_image)).getImageMatrix().toString();
//String thumb_url = ((TextView) view.findViewById(R.id.thumburl)).getText().toString();
String filesize = ((TextView) view.findViewById(R.id.duration)).getText().toString();
String thumburl = ((TextView) view.findViewById(R.id.imgurl)).getText().toString();
String doc_url = ((TextView) view.findViewById(R.id.documenturl)).getText().toString();
Intent in = new Intent(CustomizedListView.this, org.scouts.library.SingleMenuItem.class);
in.putExtra(KEY_TITLE, title);
in.putExtra(KEY_DESCRIPTION, description);
//in.putExtra(KEY_THUMB_URL, thumb_url);
in.putExtra(KEY_FILESIZE, filesize);
in.putExtra(KEY_THUMB_URL, thumburl);
in.putExtra(KEY_DOCUMENT_URL, doc_url);
startActivity(in);
}
});
}
}
i only started getting the nullpointer excepetion after i added the preference variable
Put the SharedPreferences line into you onCreate() method.
Also you need to use if(){//do something} else {//do something else}
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
if(sharedPrefs.getBoolean("french", false))
{
URL="https://dl.dropbox.com/u/######/wosm-library-EN.xml";
}
else
{
URL="https://dl.dropbox.com/u/######/wosm-library-FR.xml";
}
A far better way to do this would be to use a resource string for the Dropbox URL and provide different localizations. Then you would not need this code at all.