Witam,
- Mam pytanie: czy w C++ można napisać czytnik RSS?
- Jakich bibliotek użyć?
- Czy w libcurl można to zrobić, jeśli tak to jakich funkcji użyć
- Czy dobrze myślę: "pobieram plik xml i go parsuję"?
Witam,
Zacznij od znalezienia/napisania przyjaznej sobie klasy do czytania xml. Jeżeli masz Windows, to na pokładzie jest msxml - czyta, zapisuje i ściąga z netu, synchronicznie i asynchronicznie. Jeżeli xml nie jest gigantyczny i nie masz wstrętu do unicode, to msxml świetnie się do tego nadaje, przynajmniej na start. Trzeba go tylko obudować klasą która będzie konwertowała stringi na VARIANT'y i odwrotnie.
Główny kod mojego synchronicznego czytnika wygląda tak (troszkę html'a wyciąłem, nie pisać o błędach):
RSS::OpenRss(LPWSTR url)
{
XML doc, rss, channel, title, link, description, item;
StringStream html;
if (doc.Open(url))
{
if (doc.FindChild(L"rss", TRUE, &rss)
&& rss.FindChild(L"channel", TRUE, &channel)
&& channel.FindChild(L"title", TRUE, &title)
&& channel.FindChild(L"link", TRUE, &link)
&& channel.FindChild(L"description", TRUE, &description))
{
SetCaption(title.GetText());
// heading: <a href=link>description</a><br>
wstring url2;
wcscpy(url2,url);
WCHAR *last = wcsrchr(url2, '/');
if (last) last[1]=0;
html.WriteA("<html><body><base href='");
html.WriteW(url2);
html.WriteA("'><h2><a target='_blank' href='");
html.WriteW(link.GetText());
html.WriteA("'>");
html.WriteW(description.GetText());
html.WriteA("</a></h2><br>");
BOOL fReset = TRUE;
while (channel.FindChild(L"item", fReset, &item))
{
fReset = FALSE;
if (item.FindChild(L"title", TRUE, &title)
&& item.FindChild(L"link", TRUE, &link)
&& item.FindChild(L"description", TRUE, &description))
{
// heading: <a href=link>title</a><br>description<br>
html.WriteA("<hr><h3><a target='_blank' href='");
html.WriteW(link.GetText());
html.WriteA("'>");
html.WriteW(title.GetText());
html.WriteA("</a></h3><br>");
html.WriteW(description.GetText());
html.WriteA("<br>");
}
}
html.WriteA("</body></html>");
html.Finalize(); // append NULL char
m_browser.LoadFromString(html.Lock());
html.Unlock();
}
}
}