Avatar billede mik28 Seniormester
07. november 2007 - 10:32 Der er 12 kommentarer og
1 løsning

søge i et rss feed

Jeg skal skrive noget kode som kan søge i et rss feed. Hvor kan jeg finde nogle smarte eksempler? Det skulle ydre mere også meget gerne være sådan at man kan sætte en timeout på hvor lang tid det må tage
Avatar billede mik28 Seniormester
07. november 2007 - 13:53 #1
Hvis jeg nu tager udgangspunkt i dette eksempel jeg har fundet på javabog.dk, hvad skal der så til for at det virker

<%@page import="org.w3c.dom.*,org.apache.xpath.*,javax.xml.parsers.*" %>
<html>
<head><title>Syndikering med Java</title></head>
<body>

<%
  String kilde = request.getParameter("kilde");
  if (kilde == null) kilde = "http://www.dr.dk/nyheder/html/nyheder/rss/";

  try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    // Fortolk kildens XML-kode til et DOM-træ
    Document træ = factory.newDocumentBuilder().parse(kilde);

    // Find titlen på nyhedskilden med XPath-udtryk
    Node titel = XPathAPI.selectSingleNode(træ, "RDF/channel/title/text()");
  %>

<h1>Nyheder fra <%= titel.getNodeValue() %></h1>
<a href="<%= kilde %>" type="application/rss+xml">RSS-kilde</a> til disse nyheder.
<p>
  <%
    // Lav liste med overskrifter på artikler med XPath-udtryk
    NodeList overskrifter = XPathAPI.selectNodeList(træ, "RDF/item/title/text()");

    // Lav liste over henvisninger til mere læsninger med XPath-udtryk
    NodeList henvisninger = XPathAPI.selectNodeList(træ, "RDF/item/link/text()");

    // Gennemløb listerne og udskriv dem
    for (int i = 0; i < overskrifter.getLength(); i++) {
      out.print(overskrifter.item(i).getNodeValue());
      out.print(" <a href="+henvisninger.item(i).getNodeValue()+">mere</a><br>");
    }

  } catch (Exception e) {
    e.printStackTrace();
    out.print("Et problem opstod: "+e);
  }
%>


<p>
Prøv en anden nyhedskilde

<form>
<input type="text" name="kilde"
value="http://slashdot.org/index.rss"
size="40">
</form>

</body>
</html>
Avatar billede mik28 Seniormester
07. november 2007 - 13:55 #2
jeg får denne her fejl
An error occurred at line: 6 in the jsp file: /MINFIL.jsp
Generated servlet error:
XPathAPI cannot be resolved
Avatar billede arne_v Ekspert
08. november 2007 - 02:05 #3
Bruger du en nyere Xerces ?
Avatar billede arne_v Ekspert
08. november 2007 - 02:09 #4
Ellers hvis du bruger en nyere Java kan du importere com.sun.org.apache.xpath.internal.* !
Avatar billede mik28 Seniormester
08. november 2007 - 06:41 #5
Det her det virker sådan set nu. Jeg skal bare have det lavet sådan at jeg kun får dem som opfylder et søgekriterie

<%@page import="org.w3c.dom.*,org.apache.xpath.*,javax.xml.parsers.*" %>
<html>
<head><title>Syndikering med Java</title></head>
<body>

<%
  String kilde = request.getParameter("kilde");
  String sog  = request.getParameter("sog");
 
  if (kilde == null) kilde = "EN_ELLER_ANDEN_RSS";

  try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    // Fortolk kildens XML-kode til et DOM-tr
    Document tr = factory.newDocumentBuilder().parse(kilde);

    // Find titlen p nyhedskilden med XPath-udtryk
    Node titel = XPathAPI.selectSingleNode(tr, "RDF/channel/title/text()");
  %>

<!-- h1>Nyheder fra <%= titel.getNodeValue() %></h1 -->
<a href="<%= kilde %>" type="application/rss+xml">RSS-kilde</a> til disse nyheder.
<p>
  <%
    // Lav liste med overskrifter p artikler med XPath-udtryk
    NodeList overskrifter = XPathAPI.selectNodeList(tr, "RDF/item/title/text()");

    // Lav liste over henvisninger til mere lsninger med XPath-udtryk
    NodeList henvisninger = XPathAPI.selectNodeList(tr, "RDF/item/link/text()");
   
    NodeList beskrivelse  = XPathAPI.selectNodeList(tr, "RDF/item/description/text()");
   

    // Gennemlb listerne og udskriv dem
    for (int i = 0; i < overskrifter.getLength(); i++) {
        // if(overskrifter.equals(sog)){
      out.print(overskrifter.item(i).getNodeValue());
      out.print(" <a href="+henvisninger.item(i).getNodeValue()+">mere</a><br>");
      out.print(beskrivelse.item(i).getNodeValue());
      // }
    }

  } catch (Exception e) {
    e.printStackTrace();
    out.print("Et problem opstod: "+e);
  }
%>


<p>
Prv en anden nyhedskilde

<form>
<input type="text" name="kilde"
value="http://slashdot.org/index.rss"
size="40">
<br />
<input type="text" name="sog"
value=""
size="40">
<input type="submit" name="sg" value="sg" />
</form>

</body>
</html>
Avatar billede mik28 Seniormester
08. november 2007 - 06:46 #6
Jeg forestiller mig at jeg kan lægge et check ind her. Noget i den her retning

// Gennemlb listerne og udskriv dem
    for (int i = 0; i < overskrifter.getLength(); i++) {
      if(overskrifter.item(i).getNodeValue().equals(sog)){
      out.print(overskrifter.item(i).getNodeValue());
      out.print(" <a href="+henvisninger.item(i).getNodeValue()+">mere</a><br>");
      out.print(beskrivelse.item(i).getNodeValue());
      }
Avatar billede mik28 Seniormester
08. november 2007 - 08:39 #7
Jeg kan jo gøre sådan her

if(overskrifter.item(i).getNodeValue().equals(sog)){}

men det er ikke helt godt nok, for så skal søgekriteriet jo være helt identist med overskrifter, og det går ikke
Avatar billede mik28 Seniormester
08. november 2007 - 08:45 #8
Jeg skal afgøre om søgekriteriet findes i overskrifter.item(i).getNodeValue(), men hvordan gør jeg det? Det er et eller andet med indexOf og hvis den giver -1 så fandt den ikke noget
Avatar billede mik28 Seniormester
08. november 2007 - 09:03 #9
Hmmm jeg kan vist gøre noget i den her stil

if(overskrifter.item(i).getNodeValue().indexOf(sog)!= -1){}

så skal jeg bare have elimineret at den returnerer alt hvis den er tom. Der vil jo temmeligt sikkert være tomme felter i de fleste resultater :-)
Avatar billede mik28 Seniormester
08. november 2007 - 11:41 #10
Det virker i princippet men mit spørgsmål har ændret karakter. Det viser sig nu at ikke umiddelbart kan bruge denne her måde på det RSS feed jeg skal modtage :-(
Avatar billede mik28 Seniormester
08. november 2007 - 12:33 #11
RSS feeded ser således ud

version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
  <channel>
    <title>Title</title>
    <link>http://LINK</link>
    <description>DESCRIPTION</description>
    <language>da</language>
    <lastBuildDate>Thu, 08 Nov 2007 10:35:29 GMT</lastBuildDate>
    <docs>http://ladida</docs>
    <generator>RSSpray 0.1</generator>
    <numberOfRows xmlns='df'></numberOfRows>
    <rssid xmlns='df'>2007-11-08T10:35:29+01:00</rssid>
    <player xmlns='ff'></player>
    <item>
      <title><![CDATA[Hamburger gjorde det også]]></title>
      <file>FIL</file>
      <description><![CDATA[buygvbuygvbuy]]></description>
      <pubDate>Thu, 08 Nov 2007 09:10:03 GMT</pubDate>
      <pubDate2>08.11.2007</pubDate2>
      <createdby xmlns='bb'><![CDATA[nkjnj]]></createdby>
      <updatedby xmlns='bb'><![CDATA[knjnj]]></updatedby>
      <artikel xmlns='bb'><![CDATA[]]></artikel>
      <duration xmlns='bb'><![CDATA[114.056]]></duration>
      <opphav xmlns='bb'><![CDATA[]]></opphav>
      <clipid xmlns='bb'><![CDATA[12152]]></clipid>
      <artikelid xmlns='bb'><![CDATA[356834]]></artikelid>
      <enclosure url="kjbhjib"  type="image/png" />
      <click xmlns='bb'><![CDATA[11]]></click>
      <click24hours xmlns='bb'><![CDATA[11]]></click24hours>
      <click7days xmlns='bb'><![CDATA[11]]></click7days>
      <category>kmnkl</category>
      <category>kmkm</category>
      <category>lkmm</category>
      <category>lkmkjmk</category>
      <tag xmlns='bb'>bhbhb,ssss,a,s</tag>
    </item>
Avatar billede mik28 Seniormester
08. november 2007 - 15:39 #12
Det her spørgsmål er nu 200 points værd :-)
Avatar billede mik28 Seniormester
09. november 2007 - 08:37 #13
Jeg lukker det her spørgsmål og omformulere det i et andet
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester