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>
Annonceindlæg fra Novataris
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(); } } }
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.
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(); } } }
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>
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 :=) ?
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
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();
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")) {
25. august 2010 - 20:30
#9
doc.Root.Element("channel").Element("title").Value boer indeholde title
25. august 2010 - 20:32
#10
og et svar
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
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"))
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(); }
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.
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();
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 ?
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
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 ?
27. august 2010 - 10:09
#19
test af point
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.