C#从存储在XML文件中的Url旋转图像

时间:2014-02-05 21:02:18

标签: c#

我试图通过一个免费的winform应用程序货币化,基本上我希望在一个图片框中每隔5分钟旋转10个图像。我不想将这些硬编码到应用程序中,而是将图像URL存储在我的服务器上的xml文件中。

这是我服务器上的xml

<?xml version="1.0" encoding="utf-8"?>
<Advertisements>
    <Ad>
        <ImageUrl1>http://example.com/example.jpg</ImageUrl1>
        <url1>http://example.com</url1>
    </Ad>
    <Ad>
        <ImageUrl2>http://example.com/example2.jpg</ImageUrl2>
        <url2>http://example.com</url2>
    </Ad>
</Advertisements>

我坚持如何旋转每个节点并显示图像5分钟

试图找到一个不错的例子,但大多数都是针对ASP.net的

这是我的应用中的代码:

XmlTextReader reader = null;
try {
    string xmlURL = "http://example.com/ads.xml";
    reader = new XmlTextReader(xmlURL);
    reader.MoveToContent();
    string elementName = "";
    if ((reader.NodeType == XmlNodeType.Element) &&
    (reader.Name == "Advertisements")) {
        while (reader.Read()) {
            if (reader.NodeType == XmlNodeType.Element)
            elementName = reader.Name;
            else {
                if ((reader.NodeType == XmlNodeType.Text) &&
                (reader.HasValue)) {
                    switch (elementName)
                    {
                        case "ImageUrl1":
                            picturebox.ImageLocation=reader.Value);
                            break;
                    }
                }
            }
        }
    }
}
catch (Exception) {
}
finally {
    if (reader != null) reader.Close();
}

1 个答案:

答案 0 :(得分:0)

您当前的代码使用较旧的XmlReader方法手动解析XML。这通常是复杂而棘手的。如果您使用的是.NET 3.5或更高版本,则可以使用LINQ to XML获得更清晰的界面来使用XML。

我将采取的解决问题的方法是:

  • 在应用启动时,从服务器加载广告列表并将结果缓存到静态变量中
  • 将列表洗牌一次(加载后),这样您就可以在选择要展示的新广告时不断迭代列表(无需随机化)
  • 使用Timer实例每5分钟旋转一次图像

以下是一些使用LINQ to XML加载XML数据的示例C#代码:

using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace StackOverflowQ21588436
{
    public class Example
    {
        private const string XML =
@"<?xml version=""1.0"" encoding=""utf-8""?>
<Advertisements>
    <Ad>
        <ImageUrl>http://example.com/example.jpg</ImageUrl>
        <url>http://example.com</url>
    </Ad>
    <Ad>
        <ImageUrl>http://example.com/example2.jpg</ImageUrl>
        <url>http://example.com/2.html</url>
    </Ad>
</Advertisements>";

        public static IList<Advertisement> GetAdvertisements()
        {
            var xmlDocument = XDocument.Parse(XML); // or XDocument.Load(url)
            var adXmlNodes = xmlDocument.Element("Advertisements").Elements("Ad");
            var adList = adXmlNodes.Select(xmlNode => new Advertisement {
                ImageUrl = xmlNode.Element("ImageUrl").Value,
                Href = xmlNode.Element("url").Value
            }).ToList();
            return adList;
        }
    }

    public class Advertisement
    {
        public string ImageUrl { get; set; }
        public string Href { get; set; } // named 'Href' to show property names don't have to match XML
    }
}