Avatar billede acore Ekspert
23. november 2010 - 18:23 Der er 8 kommentarer og
1 løsning

Læsning af xml via internettet med XPathDocument

Jeg skal starte med at sige, at jeg ikke har ret meget erfaring med C#. Men nu er jeg begyndt med Visual C# 2010 Express (den gratis).

Jeg vil gerne læse fra en php-fil via internettet. php-filen returnerer et xml dokument, som skal bruges til at danne listen i en combo-boks.

Jeg er inspireret af arne_v's kode fra denne guide: http://www.eksperten.dk/guide/1259

Min kode er placeret i formens load, og ser sådan ud:

//XPathDocument doc = new XPathDocument("test.xml");
XPathDocument doc = new XPathDocument("http://minside.dk/test/test.php?action=get_albums");
XPathNavigator nav = doc.CreateNavigator();

XPathNodeIterator albums = nav.Select("//albums/album");
while(albums.MoveNext())
{
    XPathNavigator album = albums.Current;
    this.comboBoxAlbums.Items.Add(album.SelectSingleNode("album_title/text()").Value);
}

Når jeg forsøger med den kode, får jeg ingen poster. Hvis jeg derimod tilgår php-filen via min browser, kopierer resultatet ind i en xml fil og saver den lokalt, så virker det - gøres ved at bruge den udkommenterede linie 1 i stedet for linie 2.

Mine spørgsmål er:

1) Er det jeg prøver muligt? Har googlet det, og tror ja

2) Hvis det er muligt, hvad kan der så være galt?

3) Hvis det ikke er muligt, kan jeg så bruge XPathDocument eller noget tilsvarende til at læse xml fra en tekst-streng. Filen er ikke så lang, at det giver mening at save den lokalt.

Jeg kan godt læse xml filen med WebClient og UploadString, men tænkte at det var bedre at gøre det i et hug.
Avatar billede heinzdmx Nybegynder
23. november 2010 - 18:47 #1
Prøv i stedet:
XPathDocument doc =
    new XPathDocument(GetHttpWebResponse(("http://minside.dk/test/test.php?action=get_albums").GetResponseStream());


Prøv at søg på MSDN (microsoft documentation) efter XPathDocument

Der er en liste over mulige konstructors (og ingen af dem er URL/URI)

Se:
http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathdocument.aspx

I mit eksempel laver du et stream som så indlæses (tjek det link, der står at stream er en mulig konstructor)
Avatar billede acore Ekspert
23. november 2010 - 19:51 #2
Tak for superhurtigt svar!

Jeg forstår godt hvor du vil hen med din kommentar om den manglende konstruktor. Mit forsøg skyldes dels, at der på http://msdn.microsoft.com/en-us/library/te0h7f95.aspx står uri som argument (måske var der nogle wrappers, tænkte jeg) og dels at jeg fandt tråde i fora, der skrev, at man kunne. Men du har sikkert ret...

Jeg kan desværre ikke få din kode til at virke. C# vil ikke kendes ved GetHttpWebResponse(). Og jeg er ikke så god, at jeg kan gætte hvad der skulle have stået :(

jeg prøvede at kigge på http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx - men ærligt talt - jeg forstår ikke det, der står om constructors :(
Avatar billede heinzdmx Nybegynder
23. november 2010 - 20:32 #3
Ahh beklager.

For det første mangler du muligvis en using:
using System.Net;


Følgende kode burde give dig hvad du vil (og kan køre :P)

HttpWebRequest HttpWReq =
(HttpWebRequest)WebRequest.Create("http://minside.dk/test/test.php?action=get_albums");

Stream HttpWRespStream = HttpWReq.GetResponse().GetResponseStream();
       
XPathDocument doc = new XPathDocument(HttpWRespStream);

// her udfører du din kode
XPathNavigator nav = doc.CreateNavigator();

XPathNodeIterator albums = nav.Select("//albums/album");
while(albums.MoveNext())
{
    XPathNavigator album = albums.Current;
    this.comboBoxAlbums.Items.Add(album.SelectSingleNode("album_title/text()").Value);
}
// slut på din kode

HttpWRespStream.Close(); // husk at lukke stream når du er færdig
Avatar billede acore Ekspert
23. november 2010 - 20:53 #4
Tak igen. Jo, det gjorde jeg måske nok. Men nu er den der - using System.Net - og alligevel får jeg fejl på denne linie:

Stream HttpWRespStream = HttpWReq.GetResponse().GetResponseStream();

der tyder på. at jeg mangler endnu en using:

The type or namespace name 'Stream' could not be found (are you missing a using directive or an assembly reference?)

Synes ikke det er så let, at finde ud af hvilken...
Avatar billede heinzdmx Nybegynder
23. november 2010 - 21:25 #5
Avatar billede acore Ekspert
23. november 2010 - 21:31 #6
Nå, nu fandt jeg ud af, at det fjernede kompilerings-fejlen med System.IO.

Men listen genereres stadig ikke. Jeg tror, at

XPathDocument doc = new XPathDocument(HttpWRespStream);

smider en exception, mens linien før ser ud til at være ok.
Avatar billede heinzdmx Nybegynder
23. november 2010 - 21:47 #7
Siger debuggeren noget?

Ellers så smid en try-catch rundt om koden og udskriv fejlen:

Stream HttpWRespStream;
        try
        {

            HttpWebRequest HttpWReq =
    (HttpWebRequest)WebRequest.Create("http://minside.dk/test/test.php?action=get_albums");

            HttpWRespStream = HttpWReq.GetResponse().GetResponseStream();

            XPathDocument doc = new XPathDocument(HttpWRespStream);

            // her udfører du din kode
            XPathNavigator nav = doc.CreateNavigator();

            XPathNodeIterator albums = nav.Select("//albums/album");
            while (albums.MoveNext())
            {
                XPathNavigator album = albums.Current;
                this.comboBoxAlbums.Items.Add(album.SelectSingleNode("album_title/text()").Value);
            }
            // slut på din kode
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
        finally
        {
            HttpWRespStream.Close(); // husk at lukke stream når du er færdig
        }
Avatar billede acore Ekspert
23. november 2010 - 22:00 #8
Det hjalp!

Det var fordi jeg ikke havde fået encoded til utf-8 - det kunne jeg se af fejlen, og rette på serveren. Og så spillede det.

tak for hjælpen! Smid et svar
Avatar billede heinzdmx Nybegynder
23. november 2010 - 22:50 #9
Super at det spiller nu ;)

Svar her
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