Reputation: 33
UPDATE. I'm really struggling with the answers given (they're not bad answers, I'm just struggling) It would really help for more detailed answers
I'm pulling in an RSS feed into my app, the pubDate is currently showing up as for example Mon, 10 Nov 2014 03:34:38 +0000.
I need it to show up in a more user friendly manner. I've looked at all the options, SimpleDateFormat..etc, I'm sort of new to Java so all previous suggestions are just going over my head, I'm looking for what I actually need to put in my code.
Code is as follows AndroidXMLParsingActivity.java
package com.example.myapp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Locale;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import java.util.Calendar;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
public class AndroidXMLParsingActivity extends ListActivity {
// All static variables
static final String URL = "http://example.xml";
// XML node keys
static final String KEY_ITEM = "item"; // parent node
static final String KEY_DATE = "pubDate";
static final String KEY_DESC = "description";
static final String KEY_ID = "title";
static final String KEY_LDESC = "content:encoded";
@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_DESC, parser.getValue(e, KEY_DESC));
map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
map.put(KEY_DESC, parser.getValue2(e, KEY_DESC));
map.put(KEY_LDESC, parser.getValue2(e, KEY_LDESC));
// adding HashList to ArrayList
menuItems.add(map);
}
// Adding menuItems to ListView
ListAdapter adapter = new SimpleAdapter(this, menuItems,
R.layout.list_item,
new String[] { KEY_ID, KEY_LDESC, KEY_DATE}, new int[] {
R.id.name, R.id.content_encoded, R.id.pubDate });
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 description = ((TextView) view.findViewById(R.id.description)).getText().toString();
String Ldescription = ((TextView) view.findViewById(R.id.content_encoded)).getText().toString();
String pubDate = ((TextView) view.findViewById(R.id.pubDate)).getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
in.putExtra(KEY_ID, name);
in.putExtra(KEY_DESC, description);
in.putExtra(KEY_LDESC, Ldescription);
in.putExtra(KEY_DATE, pubDate);
startActivity(in);
}
});
}
}
XMLParser.java
package com.example.myapp;
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.CharacterData;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import android.util.Log;
public class XMLParser {
// constructor
public XMLParser() {
}
/**
* Getting XML from URL making HTTP request
* @param url string
* */
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;
}
/**
* Getting XML DOM element
* @param XML string
* */
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 doc;
}
/** Getting node value
* @param elem element
*/
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 "";
}
public final String getElementValue2( 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 ){
if(child.getNodeType() == Node.CDATA_SECTION_NODE){
return child.getNodeValue();
}
}
}
}
return "";
//return elem.getTextContent();
}
public static String getCharacterDataFromElement(Node elem) {
Node child = elem.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "";
}
public String getValue3(Element item, String str){
NodeList n = item.getElementsByTagNameNS("http://purl.org/rss/1.0/modules/content/", str);
String ses = this.getElementValue2(n.item(0));
//return this.getElementValue2(n.item(0));
//return ses;
String mim =ses.replaceAll("(?s)\\<.*?\\>", " \n");
//return Promjena(ses);
return mim;
}
/**
* Getting node value
* @param Element node
* @param key string
* */
public String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return this.getElementValue(n.item(0));
}
public String getValue2(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return XMLParser.getCharacterDataFromElement(n.item(0));
}
}
I'm not sure if you need any more information. I'm also sure there is a lot of bad or redundant code, any help with that would be great!
Thank you very much!
Upvotes: 1
Views: 1050
Reputation: 33
i tried replacing
String pubDate = ((TextView) view.findViewById(R.id.pubDate)).getText().toString();
with
String pubDate = "Mon, 10 Nov 2014 03:34:38 +0000";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
Date _date = null;
try {
_date = dateFormat.parse(pubDate);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(_date .toString());
// print the Date in year month and date
SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd");
((TextView) view.findViewById(R.id.pubDate)).getText().toString();
didn't work...am I on the right track?
Upvotes: 0
Reputation: 826
You can you SimpleDateFormat class to convert friendly date as following
public String getFriendlyDayString(Date pubDate){
SimpleDateFormat shortenedDateFormat = new SimpleDateFormat("EEE MMM dd");
return shortenedDateFormat.format(pubDate);
}
You can pass your pubDate to like this getFriendlyDateString(pubDate);
Upvotes: 0
Reputation: 5707
String date = "Mon, 10 Nov 2014 03:34:38 +0000";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
Date _date = null;
try {
_date = sourceFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(_date .toString());
// print the Date in year month and date
SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(targetFormat.format(_date));
Upvotes: 2