维基百科图片列表显示来自维基百科xml api

时间:2015-11-10 13:23:32

标签: c# xml image wikipedia-api

我正在尝试编写一个代码,我从wikipedia获得第一个图像api的xml格式。现在我想通过c#解析它。但是在运行代码时我无法获取图像。这是我的代码。

namespace WikiAPIWinForm
{
     public partial class WikiForm : Form
   {

    private const string url1_Image1 = "https://en.wikipedia.org/w/api.php?action=query&titles=File:Schloss%20Neuschwanstein%202013.jpg&prop=imageinfo&iiprop=comment|url|dimensions&format=xml&iiurlwidth=300"; //show 1st image
    private const string url1_Image2 = "https://en.wikipedia.org/w/api.php?action=query&titles=File:Neuschwanstein%20castle.jpg&prop=imageinfo&iiprop=comment|url|dimensions&format=xml&iiurlwidth=300";// show another image
    private const string url1_Image3 = "https://en.wikipedia.org/w/api.php?action=query&titles=File:Hohenschwangau_-_Schloss_Neuschwanstein5.jpg&prop=imageinfo&iiprop=comment|url|dimensions&format=xml&iiurlwidth=300";// show another image

   public WikiForm()
    {
        InitializeComponent();

    }


        XDocument xmlDocument1 = XDocument.Load(url1_Image1);
        XDocument xmlDocument2 = XDocument.Load(url1_Image2);
        XDocument xmlDocument3 = XDocument.Load(url1_Image3);


        var image1 = (from page in xmlDocument1.Descendants("page")
                      select new AllImage
                      {
                          Title1 = page.Attribute("title").Value,
                          Imagerepository1 = page.Attribute("imagerepository").Value,
                          Url1 = page.Element("imageinfo").Element("ii").Attribute("thumburl").Value
                      });

        ShowImages1(image1);

        var image2 = (from page in xmlDocument2.Descendants("page")
                      select new AllImage
                      {
                          Title2 = page.Attribute("title").Value,
                          Imagerepository2 = page.Attribute("imagerepository").Value,
                          Url2 = page.Element("imageinfo").Element("ii").Attribute("thumburl").Value
                      });

        ShowImages2(image2);

        var image3 = (from page in xmlDocument3.Descendants("page")
                      select new AllImage
                      {
                          Title3 = page.Attribute("title").Value,
                          Imagerepository2 = page.Attribute("imagerepository").Value,
                          Url3 = page.Element("imageinfo").Element("ii").Attribute("thumburl").Value
                      });

        ShowImages3(image3);
    }






     private void ShowImages1(IEnumerable<AllImage> image1)
    {
        var image = image1.First();

        pictureLabel1.Text = image.Title1;
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox1.LoadAsync(image.Url1);// asynchronous loading

    }



    private void ShowImages2(IEnumerable<AllImage> image2)
    {
        var image = image2.First();

        pictureLabel2.Text = image.Title2;
        pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox2.LoadAsync(image.Url2);// asynchronous loading
    }

    private void ShowImages3(IEnumerable<AllImage> image3)
    {
        var image = image3.First();

        pictureLabel3.Text = image.Title3;
        pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox3.LoadAsync(image.Url3);// asynchronous loading

    }

 }

1 个答案:

答案 0 :(得分:0)

你需要像

这样的东西
private void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false; // to prevent a new download until you have finished the old one

    XDocument xmlDocument = XDocument.Load(url1_Image);

    var images = (from page in xmlDocument.Descendants("page")
                  select new AllImage
                  {
                      Title = page.Attribute("title").Value,
                      Imagerepository = page.Attribute("imagerepository").Value,
                      Url = page.Element("imageinfo").Element("ii").Attribute("url").Value
                  });

    ShowImages(images);
};

private void ShowImages(IEnumerable<AllImage> images)
{
    var image = images.First();

    label1.Text = image.Title;
    pictureBox1.LoadAsync(image.Url); // asynchronous loading
}

下载图像后,您需要使按钮可用。

void pictureBox1_LoadCompleted(object sender, AsyncCompletedEventArgs e)
{
    button1.Enabled = true;
}

我们强烈建议为控件指定正常名称。例如,buttonLoadlabelTitlepictureBoxWikiImage

另外,我在XML信息中只看到一个图像。那么,IEnumerable集合是什么?