Avatar billede Bennis Nybegynder
25. august 2010 - 17:03 Der er 19 kommentarer og
1 løsning

læsning af RSS

Hej,

jeg har en RSS kilde som jeg skal have behandlet data fra, problemet er at det indeholder noget mystisk CDData tag, så de data jeg reel skal bruge som status, land og by, er besværlige (p.t. umulige) at læse for mig.

Hvordan får jeg hentet disse værdier ud i c# så jeg kan behandle dem videre ?

tak, eksempel nedenfor.


<channel>
    <item>
      <title>Titel på projekt</title>
      <link>Ligegyldigdata</link>
<description><![CDATA[<div><b>EventID:</b> E0033</div>
<div><b>Status:</b> Lukket</div>
<div><b>Land:</b> Danmark</div>
<div><b>By:</b> Hjørring</div>
]]></description>
</item>
</channel>
Avatar billede arne_v Ekspert
25. august 2010 - 17:19 #1
Du ville da have store problemer hvis den CDATA ikke var der.

Naar den er der kan .NET jo netop parse det som valid XML.

Eksempel:

using System;
using System.Linq;
using System.Xml.Linq;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string s = @"<channel>
    <item>
      <title>Titel på projekt</title>
      <link>Ligegyldigdata</link>
<description><![CDATA[<div><b>EventID:</b> E0033</div>
<div><b>Status:</b> Lukket</div>
<div><b>Land:</b> Danmark</div>
<div><b>By:</b> Hjørring</div>
]]></description>
</item>
</channel>";
            XDocument doc = XDocument.Parse(s);
            Console.WriteLine(doc.Root.Element("item").Element("description").Value);
            Console.ReadKey();
        }
    }
}
Avatar billede Bennis Nybegynder
25. august 2010 - 19:01 #2
Hej Arne,

du har sikkert ret, omend jeg synes det var mere valid, hvis de lå som <link></link><status></status> osv men ok.

Jeg får dog stadig ikke værdierne ud helt, men kan sikkert godt klare den herfra med lidt dirty replace af div og eventid osv, det er vel nødvendigt, søgte jo lidt en måde at få selve værdierne ud kun - som fx eventid'et, eller "Danmark" for land.
Avatar billede arne_v Ekspert
25. august 2010 - 19:16 #3
Du kan muligvis udnytte at indholdet er naesten valid XML:

using System;
using System.Linq;
using System.Xml.Linq;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string s = @"<channel>
    <item>
      <title>Titel på projekt</title>
      <link>Ligegyldigdata</link>
<description><![CDATA[<div><b>EventID:</b> E0033</div>
<div><b>Status:</b> Lukket</div>
<div><b>Land:</b> Danmark</div>
<div><b>By:</b> Hjørring</div>
]]></description>
</item>
</channel>";
            XDocument doc = XDocument.Parse(s);
            Console.WriteLine(doc.Root.Element("item").Element("description").Value);
            XDocument doc2 = XDocument.Parse("<stuff>" + doc.Root.Element("item").Element("description").Value + "</stuff>");
            foreach(XElement elm in doc2.Root.Elements("div"))
            {
                Console.WriteLine(elm.Value);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede Bennis Nybegynder
25. august 2010 - 19:25 #4
Irriterende,

jeg har prøvet med dit eksempel som jeg jo nok kan fifle mig ud af, men når jeg prøver med live data virker det ikke, så går den ned.

Her er komplet eksempel, må være noget af det før, der volder problemerne ?

<?xml version="1.0" encoding="UTF-8"?>
<!--RSS generated by Windows SharePoint Services V3 RSS Generator on 25-08-2010 06:51:28-->
<?xml-stylesheet type="text/xsl" href="/_layouts/RssXslt.aspx?List=61b3d8a0-1b56-4b4f-af8c-1c27b0ffc4b8" version="1.0"?>
<rss version="2.0">
  <channel>
    <title>Titel1</title>
    <link>Link</link>
    <description>Blabla</description>
    <lastBuildDate>Wed, 25 Aug 2010 13:51:28 GMT</lastBuildDate>
    <generator>Windows SharePoint Services V3 RSS Generator</generator>
    <ttl>60</ttl>
    <image>
      <title>Mere titel</title>
      <url>/_layouts/images/homepage.gif</url>
      <link>Link2</link>
    </image>
    <item>
      <title>TItel her</title>
      <link>link er</link>
      <description><![CDATA[<div><b>EventID:</b> E0033</div>
<div><b>Status:</b> Lukket</div>
<div><b>Land:</b> Danmark</div>
<div><b>By:</b> Hjørring</div>
]]></description>
      <author>Afsenderen</author>
      <pubDate>Tue, 11 May 2010 14:28:05 GMT</pubDate>
      <guid isPermaLink="true">skult</guid>
    </item>
  </channel>
</rss>
Avatar billede Bennis Nybegynder
25. august 2010 - 19:55 #5
Så lykkedes det mig at få det at virke ved at fjerne rss-tagget.. håber ikke det er alt for dirty :=) ?

Eneste er at jeg dumt nok ikke lige kan regne ud at løbe alle igennem, p.t får jeg kun den første 'item', mangler lige de øvrige :=) ?
Avatar billede Bennis Nybegynder
25. august 2010 - 20:03 #6
Smid et svar og så er jeg glad og tilfreds, så virker det da, omend jeg ikke er helt sikker på hvor 'korrekt' det er løst :D
Avatar billede Bennis Nybegynder
25. august 2010 - 20:19 #7
Hmmm hvordan får jeg lige titlen/title med, så er jeg virkelig lykkelig .=)

XDocument doc = XDocument.Load(url);
            s = doc.ToString().Replace(@"<rss version=""2.0"">", "").Replace("</rss>", "");
              doc =  XDocument.Parse(s);

              foreach (XElement el in doc.Root.Elements("item"))
              {

                  //Console.WriteLine(doc.Root.Element("item").Element("description").Value);
                  XDocument doc2 = XDocument.Parse("<stuff>" + doc.Root.Element("item").Element("description").Value + "</stuff>");
                  foreach (XElement elm in doc2.Root.Elements("div"))
                  {
                      Console.WriteLine(elm.Value);
                  }
              }
            Console.ReadKey();
Avatar billede arne_v Ekspert
25. august 2010 - 20:29 #8
s = doc.ToString().Replace(@"<rss version=""2.0"">", "").Replace("</rss>", "");
              doc =  XDocument.Parse(s);

              foreach (XElement el in doc.Root.Elements("item"))
              {

maa kunne laves som:

            s = doc.ToString();
              doc =  XDocument.Parse(s);

              foreach (XElement el in doc.Root.Element("channel").Elements("item"))
              {
Avatar billede arne_v Ekspert
25. august 2010 - 20:30 #9
doc.Root.Element("channel").Element("title").Value

boer indeholde title
Avatar billede arne_v Ekspert
25. august 2010 - 20:32 #10
og et svar
Avatar billede Bennis Nybegynder
25. august 2010 - 20:37 #11
arghh, den skriver jo de samme værdier ud igen og igen hehe, var jo meninegn den skulle skrive for næste item, ikke for den første for antallet af items.. kan du spotte problemet her også .o
Avatar billede arne_v Ekspert
25. august 2010 - 20:56 #12
er der flere items skal du have en loekke:

doc =  XDocument.Parse(s);
foreach (XElement item in
doc.Root.Element("channel").Elements("item"))
Avatar billede Bennis Nybegynder
25. august 2010 - 21:05 #13
Den crasher desværre i den nye foreach :/


  XDocument doc = XDocument.Load(url);
            s = doc.ToString().Replace(@"<rss version=""2.0"">", "").Replace("</rss>", "");
              doc =  XDocument.Parse(s);
           
            foreach (XElement item in doc.Root.Element("channel").Elements("item"))
              {
                  Console.WriteLine(doc.Root.Element("item").Element("description").Value);
                  XDocument doc2 = XDocument.Parse("<stuff>" + doc.Root.Element("item").Element("description").Value + "</stuff>");
                  foreach (XElement elm in doc2.Root.Elements("div"))
                  {
                      Console.WriteLine(elm.Value);
                  }
              }
            Console.ReadKey();
        }
Avatar billede arne_v Ekspert
25. august 2010 - 21:33 #14
Enten skal du af med den Replace eller saa skal du droppe Element("channel") fordi den goer channel til root.
Avatar billede Bennis Nybegynder
25. august 2010 - 22:30 #15
Har slettet replace, ville også meget gerne af med den :)
Denne linie crasher den dog så på.
XDocument doc2 = XDocument.Parse("<stuff>" + doc.Root.Element("item").Element("description").Value + "</stuff>");


Jeg har så ændret som nedenfor men så spytter den igen bare samme data ud hver gang.

XDocument doc = XDocument.Load(url);
           
              foreach (XElement item in doc.Root.Element("channel").Elements("item"))
              {
                  XDocument doc2 = XDocument.Parse("<stuff>" + doc.Root.Element("channel").Element("item").Element("description").Value + "</stuff>");
                  foreach (XElement elm in doc2.Root.Elements("div"))
                  {
                      Console.WriteLine(elm.Value);
                  }
              }
            Console.ReadKey();
Avatar billede Bennis Nybegynder
26. august 2010 - 10:52 #16
Når jeg gør sådan her:

foreach (XElement item in doc.Root.Element("channel").Elements("item"))
              {
                  string outValue = item.Value;

                  Console.WriteLine(doc.Root.Element("channel").Element("item").Element("title").Value);

Så spytter den bare samme title ud 3 gange (antallet af items).
Det er som om den ikke går videre til næste item ?
Avatar billede Syska Mester
26. august 2010 - 16:51 #17
Du tager jo i dit loop samme element ud, ligeså mange gange som der er elementer. da du bruger samme root element.

Du skal nok bruge din "item" variable i dit foreach loop.

item.Element("description").Value

mvh
Avatar billede Bennis Nybegynder
27. august 2010 - 10:08 #18
Takker, jeg kan pinlig nok ikke lige se hvor jeg kan give point her i det nye design :S ?
Avatar billede Bennis Nybegynder
27. august 2010 - 10:09 #19
test af point
Avatar billede Syska Mester
27. august 2010 - 10:15 #20
hehe, det kan jo ske ... :-)

Here to serve ... altid godt at strese af på andres problemer, de er til tider nemmere at løse, da man kan stirre sig blind på sine egne.

mvh
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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