[ mish_ns @ 19.02.2013. 07:08 ] @
Pozdrav svima.

Naime, imam zadatak da čitam podatke sa web starnice.
Tačnije treba mi srednji kurs evra sa sajta NBS.
Preko WebRequest i WebResponse objekata sam iščitao sadržaj html-a.

Sada me interesuje kako da dođem do željenog podatka o kursu.

deo sadržajakoji mi treba izgleda ovako:
Code:

<tr><td class="tableCell" style="text-align:center;">978</td><td class="tableCell" style="text-align:left;">EMU</td><td class="tableCell" style="text-align:center;">EUR</td><td class="tableCell" style="text-align:center;">1</td><td class="tableCell" style="text-align:right;">111,1627</td></tr>


Moja neka ideja je da nađem index od "EUR", onda da recimo uzmem Substring odatle plus 150 karatera, i odatle da probam izvući kurs (111,1627).
Međutim mali problem je ova jedinica između.

HVALA
[ Dusan Kondic @ 19.02.2013. 07:21 ] @
Regularan način, a po meni i lakši, je da se nakačiš na servis NBS.
Ako do sada nisi radio sa servisima, pročitaj uputstvo NBS razvojnog tima i potraži na ES nešto na ovu temu.
Jedina neprijatnost je ta što moraš da pošalješ zahtev i da sačekaš odobrenje, mada se sve to završi relativno brzo.
Pozdrav.
[ mish_ns @ 19.02.2013. 07:48 ] @
Ok...hvala.

Ako neko ima jos neku ideju nek javi...
[ ravni @ 19.02.2013. 09:38 ] @
Neki headless browser mozda. Onda moze da se napise neki lagan selektor koji odabere bas to sto ti treba

http://stackoverflow.com/quest...4757/headless-internet-browser
[ Dejan Carić @ 19.02.2013. 09:42 ] @
Ovo je klasa za parsiranje tabele. Trebaš da referenciraš HtmlAgilityPack
Code:

public class KursnaListaFetcher
{
    public KursnaLista DohvatiListu(string url)
    {
        using (var webClient = new WebClient())
        {
            webClient.Encoding = Encoding.UTF8;
            string html = webClient.DownloadString(url);

            var htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(html);

            string xpath = "//tbody[@id='index:srednjiKursLista:tbody_element']//tr";
            var rows = htmlDocument.DocumentNode.SelectNodes(xpath);

            if (rows != null)
            {
                var kursnaLista = new KursnaLista
                {
                    Valute = new List<Valuta>(rows.Count)
                };

                var cultureInfo = new CultureInfo("sr-Latn-CS");

                foreach (var row in rows)
                {
                    kursnaLista.Valute.Add(new Valuta
                    {
                        SifraValute = row.ChildNodes[0].InnerText,
                        NazivZemlje = HttpUtility.HtmlDecode(row.ChildNodes[1].InnerText),
                        OznakaValute = row.ChildNodes[2].InnerText,
                        VaziZa = int.Parse(row.ChildNodes[3].InnerText),
                        SrednjiKurs = float.Parse(row.ChildNodes[4].InnerText, cultureInfo)
                    });
                }

                return kursnaLista;
            }
        }
        return null;
    }
}

public class KursnaLista
{
    public int Broj { get; set; }
    public DateTime FormiranaNaDan { get; set; }

    public List<Valuta> Valute { get; set; }
}

public class Valuta
{
    public string SifraValute { get; set; }
    public string NazivZemlje { get; set; }
    public string OznakaValute { get; set; }
    public int VaziZa { get; set; }
    public float SrednjiKurs { get; set; }
}


Pozivanje iz aplikacije:
Code:

private static void Main()
{
    var fetcher = new KursnaListaFetcher();
    var kursnaLista = fetcher.DohvatiListu("http://www.nbs.rs/kursnaListaModul/srednjiKurs.faces?lang=lat");

    if (kursnaLista != null && kursnaLista.Valute != null)
    {
        var eur = kursnaLista.Valute.FirstOrDefault(x => x.OznakaValute == "EUR");
        Console.WriteLine("Sifra: " + eur.SifraValute);
        Console.WriteLine("Naziv zemlje: " + eur.NazivZemlje);
        Console.WriteLine("Oznaka valute: " + eur.OznakaValute);
        Console.WriteLine("Vazi za: " + eur.VaziZa);
        Console.WriteLine("Srednji kurs: " + eur.SrednjiKurs);
    }
}


Bilo bi dobro ako možeš da izmeniš fetcher tako da vraća broj liste i datum formiranja, pa da ovaj kod posluži još nekom ;)
[ Shadowed @ 19.02.2013. 10:26 ] @
Koliko ovako na brzinu vidim, taj deo koji si odvojio je istpravan xml pa ga mozes ucitati u XElement i onda lako manipulisati njime.
[ mish_ns @ 19.02.2013. 13:45 ] @
E ljudi hvala vam puno...
Ima dosta dobrih sugestija...