com.hardcopy.retrowatch.contents.FeedParser.java Source code

Java tutorial

Introduction

Here is the source code for com.hardcopy.retrowatch.contents.FeedParser.java

Source

/*
 * Copyright (C) 2014 The Retro Watch - Open source smart watch project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.hardcopy.retrowatch.contents;

import java.io.StringReader;
import java.net.URLEncoder;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import com.hardcopy.retrowatch.contents.objects.CPObject;
import com.hardcopy.retrowatch.contents.objects.FeedObject;
import com.hardcopy.retrowatch.utils.Logs;

import android.text.Html;
import android.util.Log;

public class FeedParser {

    // Global
    public static final String TAG = "FeedParser";

    //---------- Parsing tags
    private static final String PARSING_TAG_ID = "id";
    private static final String PARSING_TAG_WORD = "word";
    private static final String PARSING_TAG_RANK = "rank";
    private static final String PARSING_TAG_KEYWORD = "keyword";
    private static final String PARSING_TAG_VALUE = "value";
    private static final String PARSING_TAG_TYPE = "type";
    private static final String PARSING_TAG_LINK = "link";
    private static final String PARSING_TAG_LINKS = "links";
    private static final String PARSING_TAG_ORIGINAL_LINK = "originallink";
    private static final String PARSING_TAG_LINKURL = "linkurl";
    private static final String PARSING_TAG_URL = "url";
    private static final String PARSING_TAG_CONTENT = "content";
    private static final String PARSING_TAG_RESULT = "result";
    private static final String PARSING_TAG_RESULTS = "results";
    private static final String PARSING_TAG_ITEM = "item";
    private static final String PARSING_TAG_SOCIALPICK = "socialpick";
    private static final String PARSING_TAG_RANKED_TWIT_LIST = "rankedTwitList";
    private static final String PARSING_TAG_OWNER = "owner";
    private static final String PARSING_TAG_BODY = "body";
    private static final String PARSING_TAG_IMAGE = "image";
    private static final String PARSING_TAG_IMAGES = "images";
    private static final String PARSING_TAG_THUMBNAIL_URL = "thumbnailUrl";
    private static final String PARSING_TAG_CHANNEL = "channel";
    private static final String PARSING_TAG_TITLE = "title";
    private static final String PARSING_TAG_DESCRIPTION = "description";
    private static final String PARSING_TAG_FROM_USER_NAME = "from_user_name";
    private static final String PARSING_TAG_TEXT = "text";
    private static final String PARSING_TAG_DATA = "data";
    private static final String PARSING_TAG_CAPTION = "caption";
    private static final String PARSING_TAG_SMALL = "small";
    private static final String PARSING_TAG_NORMAL = "normal";
    private static final String PARSING_TAG_NEW = "new";
    private static final String PARSING_TAG_PP = "++";
    private static final String PARSING_TAG_COMMENT_CNT = "comment_cnt";
    private static final String PARSING_TAG_AUTHOR = "author";
    private static final String PARSING_TAG_PUBDATE = "pubDate";
    private static final String PARSING_TAG_UPDATED = "a10:updated";
    private static final String PARSING_TAG_NOTICE = "notice";
    private static final String PARSING_TAG_APP_VERSION = "appversion";
    private static final String PARSING_TAG_GUID = "guid";
    private static final String PARSING_TAG_THUMBNAIL = "thumbnail";
    private static final String PARSING_TAG_ENCLOSURE = "enclosure";

    private static final String PARSING_TAG_K = "K";
    private static final String PARSING_TAG_S = "S";
    private static final String PARSING_TAG_V = "V";

    public static final int RANK_TYPE_NONE = 0;
    public static final int RANK_TYPE_NEW = 1;

    public static final int RANK_MODIFIER_DAUM_REALTIME_KEYWORD = 10;
    public static final int RANK_MODIFIER_NAVER_REALTIME_KEYWORD = 100;
    public static final int RANK_MODIFIER_DAUM_SOCIALPICK = 1000;

    public static final String ENCODING_TYPE_EUC_KR = "euc-kr";
    public static final String ENCODING_TYPE_UTF_8 = "utf-8";

    private static final int PARSER_ID_SUBSTRING_MAX = 240;

    private static final String REG_EXP_REMOVE_TAG = "\\<.*?\\>";
    private static final String REG_EXP_URL = "((http|https|ftp|mms):\\/\\/[0-9a-z-]+(\\.[_0-9a-z-]+)+(:[0-9]{2,4})?\\/?)";
    private static final String REG_EXP_IMAGE_URL = "(?i)http://[a-zA-Z0-9_.\\-%&=?!:;@\"'/]*(?i)(.gif|.jpg|.png|.jpeg)";
    private static final String REG_EXP_REMOVE_NEWLINE = "\\n\\n";
    private static final String STRING_RSS_SPLIT_TAG = "\\[\\[:\\+:\\]\\]";

    // Context, system

    // Constructor
    public FeedParser() {
    }

    /*****************************************************
     *      Public methods
     ******************************************************/

    public ArrayList<FeedObject> parseResultString(CPObject CpObj, String strResult) {
        if (CpObj == null)
            return null;

        int type = CpObj.mId;
        ArrayList<FeedObject> feedList = new ArrayList<FeedObject>();

        Logs.d(TAG, "# Parsing string :: CP type = " + CpObj.mId + ", parsing type = " + CpObj.mParsingType);

        switch (CpObj.mParsingType) {
        case FeedObject.REQUEST_TYPE_DAUM_REALTIME_KEYWORDS: {
            try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = factory.newDocumentBuilder();

                InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(strResult));

                Document doc = db.parse(is);
                Element element = doc.getDocumentElement();

                NodeList items = element.getElementsByTagName(PARSING_TAG_WORD); // <realtime/>[ <word/> {<rank/><keyword/><value/><type/><linkurl/>} ]

                for (int i = 0; i < items.getLength(); i++) {
                    String link = null;
                    String keyword = null;
                    String content = null;
                    String thumbnail = null;
                    int rankType = RANK_TYPE_NONE;
                    int rankUpAndDown = 0;
                    int commentCount = 0;

                    Node item = items.item(i); //  ? Node? ??  .
                    NodeList children = item.getChildNodes(); // ?? Node 

                    for (int j = 0; j < children.getLength(); j++) {
                        Node child = children.item(j);
                        String nodeName = child.getNodeName();
                        if (nodeName.equalsIgnoreCase(PARSING_TAG_KEYWORD)) {
                            String temp = child.getFirstChild().getNodeValue();
                            if (temp != null)
                                keyword = new String(temp.getBytes());
                        } else if (nodeName.equalsIgnoreCase(PARSING_TAG_LINKURL)) {
                            String temp = child.getFirstChild().getNodeValue();
                            if (temp != null)
                                link = new String(temp.getBytes(), ENCODING_TYPE_UTF_8);
                        } else if (nodeName.equalsIgnoreCase(PARSING_TAG_TYPE)) {
                            String temp = child.getFirstChild().getNodeValue();
                            if (temp != null) {
                                String temp2 = new String(temp.getBytes(), ENCODING_TYPE_UTF_8); // <type> value : "new" or "++"
                                if (temp2.equalsIgnoreCase(PARSING_TAG_NEW))
                                    rankType = RANK_TYPE_NEW;
                            }
                        } else if (nodeName.equalsIgnoreCase(PARSING_TAG_VALUE)) {
                            try {
                                String temp = child.getFirstChild().getNodeValue();
                                if (temp != null && temp.length() > 0) {
                                    String temp2 = new String(temp.getBytes(), ENCODING_TYPE_UTF_8); // <value> : 
                                    rankUpAndDown = Integer.parseInt(temp2) / RANK_MODIFIER_DAUM_REALTIME_KEYWORD; // TODO:
                                    if (rankUpAndDown > 10)
                                        rankUpAndDown = 10;
                                }
                            } catch (Exception e) {
                            }
                        }
                    } // End of for loop

                    if (keyword != null && link != null) {
                        String idStr = keyword;
                        FeedObject feed = new FeedObject(type, idStr, link, keyword, null, null);
                        feed.mDownloadStatus = FeedObject.CONTENT_DOWNLOAD_STATUS_INIT;
                        feed.setRankInfo(rankType, rankUpAndDown, commentCount);
                        feedList.add(feed);
                    }

                    if (i >= CpObj.mCachingCount - 1) { // Break loop if count has reached caching count
                        break;
                    }
                } // End of for loop

            } catch (Exception e) {
                Logs.d(TAG, e.getMessage() == null ? "Unknown error while parsing xml" : e.getMessage());
                e.printStackTrace();
                feedList = null;
            }
            break;
        }

        case FeedObject.REQUEST_TYPE_NAVER_REALTIME_KEYWORDS: {
            try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = factory.newDocumentBuilder();

                InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(strResult));

                Document doc = db.parse(is);
                Element element = doc.getDocumentElement();

                NodeList temp = element.getElementsByTagName(PARSING_TAG_ITEM); // result -> item 
                NodeList items = temp.item(0).getChildNodes(); // List contains R1, R2...

                //? ? ??? Node ?
                for (int i = 0; i < items.getLength(); i++) {
                    String link = null;
                    String keyword = null;
                    String content = null;
                    String thumbnail = null;
                    int rankType = RANK_TYPE_NONE;
                    int rankUpAndDown = 0;
                    int commentCount = 0;

                    Node item = items.item(i); // <Rn> :    n-th R tag
                    NodeList children = item.getChildNodes(); // <k> <s> <v>

                    for (int j = 0; j < children.getLength(); j++) {
                        Node child = children.item(j);
                        String nodeName = child.getNodeName();
                        if (nodeName.equalsIgnoreCase(PARSING_TAG_K)) {
                            String tempStr = child.getFirstChild().getNodeValue();
                            if (tempStr != null)
                                keyword = new String(tempStr.getBytes());
                        } else if (nodeName.equalsIgnoreCase(PARSING_TAG_V)) {
                            String tempStr = child.getFirstChild().getNodeValue();
                            rankUpAndDown = Integer.parseInt(tempStr) / RANK_MODIFIER_NAVER_REALTIME_KEYWORD; // TODO: 
                            if (rankUpAndDown > 10)
                                rankUpAndDown = 10;
                        }
                    }

                    if (keyword != null) {
                        String idStr = keyword;
                        FeedObject feed = new FeedObject(type, idStr, null, keyword, null, null);
                        feed.mDownloadStatus = FeedObject.CONTENT_DOWNLOAD_STATUS_INIT;
                        feed.setRankInfo(rankType, rankUpAndDown, commentCount);
                        feedList.add(feed);
                    }

                    if (i >= CpObj.mCachingCount - 1) { // Break loop if count has reached caching count
                        break;
                    }
                } // End of for loop

            } catch (Exception e) {
                Logs.d(TAG, e.getMessage() == null ? "Unknown error while parsing xml" : e.getMessage());
                e.printStackTrace();
                feedList = null;
            }
            break;
        }

        case FeedObject.REQUEST_TYPE_DAUM_SOCIAL_PICK: {
            try {
                JSONObject jsonRoot = new JSONObject(strResult); // root { 
                JSONObject jsonObjSocialPick = jsonRoot.getJSONObject(PARSING_TAG_SOCIALPICK); // { socialpick :
                JSONArray jsonArray = jsonObjSocialPick.getJSONArray(PARSING_TAG_ITEM); // {item: [

                for (int i = 0; i < jsonArray.length(); i++) {
                    String link = null;
                    String keyword = null;
                    String content = null;
                    String thumbnail = null;
                    int rankType = RANK_TYPE_NONE;
                    int rankUpAndDown = 0;
                    int commentCount = 0;

                    JSONObject obj = jsonArray.getJSONObject(i); // {rank:1, link:"xx", keyword:"xx", content:"xx", count:30000, quotation_cnt:1345, comment_cnt:13816, rank_diff:3, category:"c" }
                    link = obj.getString(PARSING_TAG_LINK);
                    keyword = obj.getString(PARSING_TAG_KEYWORD);
                    content = obj.getString(PARSING_TAG_CONTENT);
                    commentCount = obj.getInt(PARSING_TAG_COMMENT_CNT) / RANK_MODIFIER_DAUM_SOCIALPICK;
                    commentCount = commentCount * 2; // To encourage rank priority
                    if (commentCount > 10)
                        commentCount = 10;

                    if (link != null && keyword != null && content != null) {
                        String idStr = keyword;
                        FeedObject feed = new FeedObject(type, idStr, link, keyword, content, null);
                        feed.mDownloadStatus = FeedObject.CONTENT_DOWNLOAD_STATUS_INIT;
                        feed.setRankInfo(rankType, rankUpAndDown, commentCount);
                        feedList.add(feed);
                    }

                    if (i >= CpObj.mCachingCount - 1) { // Break loop if count has reached caching count
                        break;
                    }
                } // End of for loop
            } catch (JSONException e) {
                Logs.d(TAG, "##### JSON Parsing stopped with error :");
                e.printStackTrace();
                feedList = null;
            }
            break;
        }

        case FeedObject.REQUEST_TYPE_TWITTER_HOTTEST:
        case FeedObject.REQUEST_TYPE_TWITTER_REALTIME:
        case FeedObject.REQUEST_TYPE_TWITTER_TODAY:
        case FeedObject.REQUEST_TYPE_TWITTER_IMAGE: {
            String link = null;
            String keyword = null;
            String content = null;
            String thumbnail = null;

            try {
                JSONObject jsonRoot = new JSONObject(strResult); // root { 
                JSONArray jsonObjList = jsonRoot.getJSONArray(PARSING_TAG_RANKED_TWIT_LIST); // { rankedTwitList : [

                for (int i = 0; i < jsonObjList.length(); i++) {
                    JSONObject obj = jsonObjList.getJSONObject(i); // id, owner, body, rtRank, rtCount, registDate, links:{}, rtTwitCount, twitId

                    //---------- make content
                    String idStr = obj.getString(PARSING_TAG_ID);
                    String name = obj.getString(PARSING_TAG_OWNER);
                    content = obj.getString(PARSING_TAG_BODY);

                    JSONObject linkObj = obj.getJSONObject(PARSING_TAG_LINKS);
                    if (linkObj != null) {
                        try { // If there is no <image> object, skip below routine
                            JSONArray imageObjList = linkObj.getJSONArray(PARSING_TAG_IMAGE);
                            if (imageObjList != null) {
                                // Multiple images can be found, but we'll take only first one.
                                JSONObject objImg = imageObjList.getJSONObject(0);
                                thumbnail = objImg.getString(PARSING_TAG_THUMBNAIL_URL);
                                link = objImg.getString(PARSING_TAG_URL);
                            }
                        } catch (Exception e) {
                        }
                    }

                    if (idStr != null && content != null) {
                        FeedObject feed = new FeedObject(type, idStr, link, keyword, content, thumbnail);
                        if (name != null)
                            feed.setName(name);
                        else
                            Log.d(TAG, "+++ Parsing :: id is null");

                        feed.mDownloadStatus = FeedObject.CONTENT_DOWNLOAD_STATUS_INIT;
                        feedList.add(feed);
                    }

                    if (i >= CpObj.mCachingCount - 1) { // Break loop if count has reached caching count
                        break;
                    }
                } // End of for loop
            } catch (JSONException e) {
                Logs.d(TAG, "##### JSON Parsing stopped with error :");
                e.printStackTrace();
                feedList = null;
            }
            break;
        }

        case FeedObject.REQUEST_TYPE_NAVER_RELATED_KEYWORDS: {
            try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = factory.newDocumentBuilder();

                InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(strResult));

                // Document Element  w3c dom? ? ? .
                Document doc = db.parse(is);
                Element element = doc.getDocumentElement();

                NodeList temp = element.getElementsByTagName(PARSING_TAG_ITEM); // result -> item 

                //? ? ??? Node ?
                for (int i = 0; i < temp.getLength(); i++) {
                    String keyword = null;
                    Node item = temp.item(i);
                    String tempStr = item.getFirstChild().getNodeValue();
                    if (tempStr != null && tempStr.length() > 0)
                        keyword = new String(tempStr.getBytes());

                    if (keyword != null) {
                        FeedObject feed = new FeedObject(type, keyword, null, keyword, null, null);
                        feedList.add(feed);
                    }

                    if (i >= CpObj.mCachingCount - 1) { // Break loop if count has reached caching count
                        break;
                    }
                } // End of for loop

            } catch (Exception e) {
                Logs.d(TAG, e.getMessage() == null ? "Unknown error while parsing xml" : e.getMessage());
                e.printStackTrace();
                feedList = null;
            }
            break;
        }

        case FeedObject.REQUEST_TYPE_9GAG_HOT:
        case FeedObject.REQUEST_TYPE_9GAG_TREND: {
            try {
                JSONObject jsonRoot = new JSONObject(strResult); // root { 
                JSONArray jsonArray = jsonRoot.getJSONArray(PARSING_TAG_DATA); // {data: [

                long current = System.currentTimeMillis();
                for (int i = 0; i < jsonArray.length(); i++) {
                    String id = null;
                    String link = null;
                    String keyword = null;
                    String content = null;
                    String thumbnail = null;
                    String fullSizeImage = null;
                    // {id:xx, from:{name:xx}, caption:xx, images:{small:xx, normal:xx, large:xx}, link:xx, action:{like:xx, dislike:xx, unlike:xx}, vote:{count:xx}
                    JSONObject obj = jsonArray.getJSONObject(i);
                    id = obj.getString(PARSING_TAG_ID);
                    link = obj.getString(PARSING_TAG_LINK);
                    keyword = obj.getString(PARSING_TAG_CAPTION);
                    JSONObject objImage = obj.getJSONObject(PARSING_TAG_IMAGES);
                    thumbnail = objImage.getString(PARSING_TAG_SMALL);
                    fullSizeImage = objImage.getString(PARSING_TAG_NORMAL);

                    if (id != null && link != null && keyword != null && thumbnail != null) {
                        FeedObject feed = new FeedObject(type, id, link, keyword, null, thumbnail);
                        feed.setFullSizeImageURL(fullSizeImage);
                        feedList.add(feed);
                    }

                    if (i >= CpObj.mCachingCount - 1) { // Break loop if count has reached caching count
                        break;
                    }
                } // End of for loop
            } catch (JSONException e) {
                Logs.d(TAG, "##### JSON Parsing stopped with error :");
                e.printStackTrace();
                feedList = null;
            }
            break;
        }

        case FeedObject.REQUEST_TYPE_NOTICE: {
            try {
                JSONObject jsonRoot = new JSONObject(strResult); // root { 
                JSONArray jsonArray = jsonRoot.getJSONArray(PARSING_TAG_NOTICE); // {notice: [

                long current = System.currentTimeMillis();
                for (int i = 0; i < jsonArray.length(); i++) {
                    int version = 0;
                    String id = null;
                    String link = null;
                    String name = null;
                    String keyword = null;
                    String content = null;
                    String thumbnail = null;
                    String fullSizeImage = null;
                    // {title:XXX, LINK:XXX, description:XXX, author:XXX, appversion:XXX, pubDate:XXX
                    JSONObject obj = jsonArray.getJSONObject(i);

                    keyword = obj.getString(PARSING_TAG_TITLE);
                    link = obj.getString(PARSING_TAG_LINK);
                    content = obj.getString(PARSING_TAG_DESCRIPTION);
                    name = obj.getString(PARSING_TAG_AUTHOR);
                    version = obj.getInt(PARSING_TAG_APP_VERSION);
                    id = obj.getString(PARSING_TAG_PUBDATE);

                    if (id != null && link != null && keyword != null) {
                        FeedObject feed = new FeedObject(type, id, link, keyword, content, null);
                        feed.setName(name);
                        feed.setDate(id);
                        feed.setVersion(version);
                        feedList.add(feed);
                    }

                    if (i >= CpObj.mCachingCount - 1) { // Break loop if count has reached caching count
                        break;
                    }
                } // End of for loop
            } catch (JSONException e) {
                Logs.d(TAG, "##### JSON Parsing stopped with error :");
                e.printStackTrace();
                feedList = null;
            }
            break;
        }

        case FeedObject.REQUEST_TYPE_RSS_DEFAULT:
        case FeedObject.REQUEST_TYPE_RSS_FEED43: {
            try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = factory.newDocumentBuilder();

                InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(strResult));

                // Document Element  w3c dom? ? ? .
                Document doc = db.parse(is);
                Element element = doc.getDocumentElement();

                // Extract logo image
                try {
                    NodeList logoImage = element.getElementsByTagName(PARSING_TAG_IMAGE);
                    if (logoImage != null && logoImage.getLength() > 0) {
                        Node logoitem = logoImage.item(0);
                        NodeList logochildren = logoitem.getChildNodes();
                        for (int j = 0; j < logochildren.getLength(); j++) {
                            Node logochild = logochildren.item(j);
                            String logoName = logochild.getNodeName();
                            if (logoName.equalsIgnoreCase(PARSING_TAG_URL)) {
                                String tempStr = logochild.getFirstChild().getNodeValue();
                                if (tempStr != null && tempStr.length() > 0)
                                    CpObj.mLogoImage = tempStr;
                            }
                        }
                    }
                } catch (Exception e) {
                }

                NodeList temp = element.getElementsByTagName(PARSING_TAG_ITEM); // channel -> item 

                long current = System.currentTimeMillis();
                for (int i = 0; i < temp.getLength(); i++) {
                    int version = 0;
                    String guid = null;
                    String name = null;
                    String date = null;
                    String link = null;
                    String keyword = null;
                    String content = null;
                    String thumbnail = null;
                    Node item = temp.item(i); // <item> :    n-th item tag
                    NodeList children = item.getChildNodes(); // <title> <author> <link> <description> <pubDate>

                    for (int j = 0; j < children.getLength(); j++) {
                        try { // If error occurs in this block, skip current item parsing and go next
                            Node child = children.item(j);
                            String nodeName = child.getNodeName();
                            if (nodeName.equalsIgnoreCase(PARSING_TAG_LINK)) {
                                String tempStr = child.getFirstChild().getNodeValue();
                                if (tempStr != null)
                                    link = new String(tempStr.getBytes());
                            } else if (nodeName.equalsIgnoreCase(PARSING_TAG_TITLE)) {
                                String tempStr = child.getFirstChild().getNodeValue();
                                if (tempStr != null) {
                                    keyword = new String(tempStr.getBytes());
                                }
                            } else if (nodeName.equalsIgnoreCase(PARSING_TAG_DESCRIPTION)) {
                                String tempStr = child.getFirstChild().getNodeValue();
                                if (tempStr != null) {
                                    String[] strArray = tempStr.split(STRING_RSS_SPLIT_TAG);
                                    if (strArray[0] != null && strArray[0].length() > 0) {
                                        strArray[0] = Html.fromHtml(strArray[0]).toString();
                                        strArray[0] = strArray[0].replaceAll(REG_EXP_REMOVE_TAG, "");
                                        strArray[0] = strArray[0].replaceAll(REG_EXP_REMOVE_NEWLINE, "");
                                        content = strArray[0];
                                    }
                                    if (strArray.length > 1 && strArray[1] != null && strArray[1].length() > 0) {
                                        thumbnail = strArray[1];
                                    }
                                }
                            } else if (nodeName.equalsIgnoreCase(PARSING_TAG_AUTHOR)) {
                                if (child != null && child.getFirstChild() != null) {
                                    String tempStr = child.getFirstChild().getNodeValue();
                                    if (tempStr != null)
                                        name = new String(tempStr.getBytes());
                                }
                            } else if (nodeName.equalsIgnoreCase(PARSING_TAG_PUBDATE)) {
                                if (child != null && child.getFirstChild() != null) {
                                    String tempStr = child.getFirstChild().getNodeValue();
                                    if (tempStr != null)
                                        date = new String(tempStr.getBytes());
                                }
                            } else if (nodeName.equalsIgnoreCase(PARSING_TAG_GUID)) {
                                if (child != null && child.getFirstChild() != null) {
                                    String tempStr = child.getFirstChild().getNodeValue();
                                    if (tempStr != null)
                                        guid = new String(tempStr.getBytes());
                                }
                            } else if (nodeName.equalsIgnoreCase(PARSING_TAG_APP_VERSION)) {
                                if (child != null && child.getFirstChild() != null) {
                                    String tempStr = child.getFirstChild().getNodeValue();
                                    if (tempStr != null && tempStr.length() > 0)
                                        version = Integer.parseInt(tempStr);
                                }
                            } else if (nodeName.contains(PARSING_TAG_THUMBNAIL)) {
                                try {
                                    if (child != null && child.hasAttributes()) {
                                        NamedNodeMap attrs = child.getAttributes();
                                        for (int k = 0; k < attrs.getLength(); k++) {
                                            Node attr = attrs.item(k);
                                            if (attr.getNodeName().equalsIgnoreCase(PARSING_TAG_URL)) {
                                                thumbnail = attr.getNodeValue();
                                            }
                                        }
                                    }
                                } catch (Exception e) {
                                    thumbnail = null;
                                }

                            } else if (nodeName.contains(PARSING_TAG_ENCLOSURE)) {
                                try {
                                    if (child != null && child.hasAttributes()) {
                                        NamedNodeMap attrs = child.getAttributes();
                                        for (int k = 0; k < attrs.getLength(); k++) {
                                            Node attr = attrs.item(k);
                                            if (attr.getNodeName().equalsIgnoreCase(PARSING_TAG_URL)) {
                                                thumbnail = attr.getNodeValue();
                                            }
                                        }
                                    }
                                } catch (Exception e) {
                                    thumbnail = null;
                                }

                            }

                        } catch (Exception e) {
                            Logs.d(TAG,
                                    e.getMessage() == null ? "Unknown error while parsing xml" : e.getMessage());
                            e.printStackTrace();
                        }

                    } // End of for loop.... parsing each item

                    if (link != null && keyword != null && content != null) {
                        StringBuilder sb = new StringBuilder();
                        if (guid != null) {
                            sb.append("rss_").append(removeSpecialChars(guid));
                        } else if (date != null) {
                            sb.append("rss_").append(date.replace(",", "").replace(":", "").trim());
                        } else {
                            String temp1 = null;
                            if (keyword.length() > 50)
                                temp1 = keyword.substring(0, 50);
                            else
                                temp1 = keyword;
                            temp1 = URLEncoder.encode(temp1, ENCODING_TYPE_UTF_8).replace("+", "%20")
                                    .replace("*", "%2A").replace("%7E", "~");
                            if (temp1.length() > PARSER_ID_SUBSTRING_MAX)
                                temp1 = temp1.substring(0, PARSER_ID_SUBSTRING_MAX - 1);
                            temp1 = temp1.trim();
                            sb.append("rss_").append(temp1);
                        }

                        FeedObject feed = new FeedObject(type, sb.toString(), link, keyword, content, thumbnail);
                        feed.mDownloadStatus = FeedObject.CONTENT_DOWNLOAD_STATUS_INIT;
                        feed.setDate(date);
                        feed.setName(name);
                        if (CpObj.mParsingType == FeedObject.REQUEST_TYPE_NOTICE && version > 0)
                            feed.setVersion(version);
                        feedList.add(feed);
                    }

                    if (i >= CpObj.mCachingCount - 1) { // Break loop if count has reached caching count
                        break;
                    }
                } // End of for loop

            } catch (Exception e) {
                Logs.d(TAG, e.getMessage() == null ? "Unknown error while parsing xml" : e.getMessage());
                e.printStackTrace();
                feedList = null;
            }
            break;
        } // End of default block

        } // End of switch(type)

        return feedList;

    } // End of parseResultString()

    public static String removeSpecialChars(String str) {
        String match = "[^\uAC00-\uD7A3xfe0-9a-zA-Z\\s]";
        str = str.replaceAll(match, " ");
        return str;
    }

}