2017-04-11 3 views
0

Ich habe eine Android-App mit einem RSS-Feed als Startseite erstellt. Eine der Funktionen meiner App besteht darin, mehrere Benutzer mit unterschiedlichen Voreinstellungen zu haben. Ist es für den Benutzer möglich, Stichwörter einzugeben, an denen er interessiert ist, und dann diese Schlüsselwörter zu verwenden, um die vom RSS-Feed bereitgestellten Nachrichten zu filtern? Ich bin ziemlich neu in Android-Programmierung und ich bin völlig auf diesem fest. Ich würde wirklich jede Hilfe oder Ideen schätzen!Wie filtert man einen RSS-Feed mit Keywords?

Der Hauptteil des Codes für meinen RSS-Feed (Fragen Sie, wenn Sie mehr Code benötigen):

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; 
    } 
} 

Antwort

2

Sie sollten XML-Datei mit ausgewählten Parser analysieren (Sie DOM gewählt Parse, aber ich empfehle Ihnen überprüfen SimpleXML). Dann füllen Sie Ihre Liste mit geparsten Daten. Erstellen Sie eine neue Methode, die prüft, ob das Objekt das benötigte Tag enthält.

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

Danke, ich werde das ausprobieren! Würden Sie SimpleXML über DOM empfehlen? Danke nochmal Anton. – Joe

+1

Ich verwende SimpleXML in meinen Apps, weil Sie Ihre Mojo-Objekte einfach mit Annotationen abbilden und dann einfach die XML-Datei deserialisieren können –