2017-04-11 2 views
0

RSS 피드가있는 안드로이드 앱을 홈페이지로 만들었습니다. 내 응용 프로그램의 기능 중 하나는 다른 사용자가 여러 사용자를 갖는 것입니다. 사용자가 관심있는 키워드를 입력 한 다음 해당 키워드를 사용하여 RSS 피드에서 제공하는 뉴스를 필터링 할 수 있습니까? 나는 안드로이드 프로그래밍에 상당히 익숙하다. 그리고 나는 이것에 완전히 매달렸다. 나는 어떤 도움이나 아이디어라도 정말로 appriciate 할 것이다!RSS 피드를 키워드로 필터링하는 방법은 무엇입니까?

내 RSS 피드에 대한 코드의 주요 부분은 (당신이 더 많은 코드가 필요하면 그냥 물어) :

import android.app.ProgressDialog; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.provider.DocumentsContract; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 

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

import static android.R.attr.data; 

/** 
* Created by Joe on 04/03/2017. 
*/ 
public class ReadRss extends AsyncTask<Void,Void,Void>{ 
    ArrayList<FeedItem>feedItems; 
    RecyclerView recyclerView; 
    Context context; 
    static ArrayList<String>address; 

    static { 
     address=new ArrayList<>(); 
     address.add("https://www.bloomberg.com/politics/feeds/site.xml"); 
     address.add("https://www.bloomberg.com/feeds/podcasts/etf_report.xml"); 
    } 
    //String address="https://www.bloomberg.com/feeds/podcasts/etf_report.xml"; 
    // String address2="www.bloomberg.com/politics/feeds/site.xml"; 
    ProgressDialog progressDialog; 
    URL url; 
    public ReadRss(Context context, RecyclerView recyclerView){ 
     this.recyclerView=recyclerView; 
     this.context=context; 
     progressDialog=new ProgressDialog(context); 
     progressDialog.setMessage("Loading..."); 
    } 

    @Override 
    protected void onPreExecute() { 
     progressDialog.show(); 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 

     super.onPostExecute(aVoid); 
     progressDialog.dismiss(); 
     MyAdapter adapter=new MyAdapter(context,feedItems); 
     recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
     recyclerView.addItemDecoration(new VerticalSpace(50)); 
     recyclerView.setAdapter(adapter); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     ProcessXml(Getdata()); 
     return null; 
    } 

    private void ProcessXml(ArrayList<Document> data) { 
     if (data != null) { 
      feedItems = new ArrayList<>(); 
      for (Document doc : data) { 
       Element root = doc.getDocumentElement(); 
       Node channel = root.getChildNodes().item(0); 
       NodeList items = channel.getChildNodes(); 
       for (int i = 0; i < items.getLength(); i++) { 
        Node currentchild = items.item(i); 
        if (currentchild.getNodeName().equalsIgnoreCase("item")) { 
         FeedItem item = new FeedItem(); 
         NodeList itemchilds = currentchild.getChildNodes(); 
         for (int j = 0; j < itemchilds.getLength(); j++) { 
          Node current = itemchilds.item(j); 
          if (current.getNodeName().equalsIgnoreCase("title")) { 
           item.setTitle(current.getTextContent()); 
          } else if (current.getNodeName().equalsIgnoreCase("description")) { 
           item.setDescription(current.getTextContent()); 
          } else if (current.getNodeName().equalsIgnoreCase("pubDate")) { 
           item.setPubDate(current.getTextContent()); 
          } else if (current.getNodeName().equalsIgnoreCase("link")) { 
           item.setLink(current.getTextContent()); 
          } 

         } 
         feedItems.add(item); 
         Log.d("itemTitle", item.getTitle()); 
         Log.d("itemDescription", item.getTitle()); 
         Log.d("itemLink", item.getTitle()); 
         Log.d("itemPubDate", item.getTitle()); 
        } 
       } 
      } 
     } 
    } 

    public ArrayList<Document> Getdata(){ 
     ArrayList<Document> documents = new ArrayList<>(); 
     for (String addr: address) { 
      try { 
       url = new URL(addr); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.setRequestMethod("GET"); 
       InputStream inputStream = connection.getInputStream(); 
       DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
       DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
       Document xmlDoc = builder.parse(inputStream); 
       documents.add(xmlDoc); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
     return documents; 
    } 
} 

답변

2

당신은 선택 파서 (선택한 DOM 구문 분석과 XML 파일을 구문 분석해야하지만, 내가보기 엔 당신이 확인하는 것이 좋습니다 SimpleXML). 그런 다음 구문 분석 된 데이터로 목록을 채 웁니다. 객체가 필요한 태그를 포함하고 있는지 확인하는 새로운 메소드를 작성하십시오.

List<FeedItem> feeds = new ArrayList<>(); 
    for(FeedItem feedItem : feedItems){ 
     if (feedItem.getTitle().equals("tag which you want")){ 
      feeds.add(feedItem); 
     } 
    } 
    return feeds; 
+0

감사합니다. DOM을 통해 SimpleXML을 추천 해 주시겠습니까? 다시 Anton에게 감사드립니다. – Joe

+1

내 애플 리케이션에서 SimpleXML을 사용합니다. 주석을 사용하여 mojo 객체를 쉽게 매핑하고 xml 파일을 deserialize 할 수 있기 때문입니다. –

관련 문제