4

我试图让我的 winform 应用程序读取存储在 Dropbox 上的 xml 文件。但是当它到达

if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "updater"))

然后就不会继续了。但是如果我删除 && (reader.Name == "updater") 那么它会继续但​​它仍然不读取 "version" 和 "url" 的值。

update.xml 链接:https ://www.dropbox.com/s/25gcpllsqsj1qrq/update.xml

下面是我项目中的 C# 代码。我正在尝试使用 XmlTextReader 读取 Dropbox 上的 update.xml,但我永远无法取回任何值!

我试图放置消息框来显示 reader.Name,但它返回“html”而不是“updater”。

它不一定是 XmlTextReader。只要解决方案有效,就可以了:D

任何帮助将不胜感激。

private void checkForUpdatesToolStripMenuItem_Click(object sender, EventArgs e)
{
    Version newVersion = null;
    string url = "";
    XmlTextReader reader = null;

    try
    {
        string xmlURL = "https://www.dropbox.com/s/25gcpllsqsj1qrq/update.xml";
        reader = new XmlTextReader(xmlURL);
        reader.MoveToContent();
        string elementName = "";
        if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "updater"))
        {
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element) elementName = reader.Name;
                else
                {
                    if ((reader.NodeType == XmlNodeType.Text) && (reader.HasValue))
                    {
                        switch (elementName)
                        {
                            case "version":
                                newVersion = new Version(reader.Value);
                                break;
                            case "url":
                                url = reader.Value;
                                break;
                        }
                    }
                }
            }
        }
    }
    catch (Exception)
    {
    }
    finally
    {
        if (reader != null) reader.Close();
    }

    Version curVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;  
    if (curVersion.CompareTo(newVersion) < 0)
    { 
        string title = "New version detected.";
        string question = "Download the new version?";
        if (DialogResult.Yes == MessageBox.Show(this, question, title, MessageBoxButtons.YesNo, MessageBoxIcon.Question))
        {
            System.Diagnostics.Process.Start(url);
        }
    }
    else
    { 
        MessageBox.Show("The program is up to date!");
    }
}
4

1 回答 1

4

好吧,访问提供的 Url 并不会像您期望的那样为您提供 XML 文件,它实际上是通过 Dropbox 包装器为您提供内容。因此,当您阅读时,您实际上是在点击HTML页面。elementName您可以通过在每次迭代上放置一个断点来仔细检查这一点。

这是正确的 URL https://dl.dropboxusercontent.com/s/25gcpllsqsj1qrq/update.xml?token_hash=AAFnI4T9nSCGeVgDKLm7YB79dbjNtoYkAj_mChxVDZL0AQ&dl=1(从Download按钮中获取),在这里试一试:

string xmlURL = "https://dl.dropboxusercontent.com/s/25gcpllsqsj1qrq/update.xml?token_hash=AAFnI4T9nSCGeVgDKLm7YB79dbjNtoYkAj_mChxVDZL0AQ&dl=1";

这是将内容加载到 aXDocument并使用 LINQ 进一步查询它的另一种方法:

string url = "https://dl.dropboxusercontent.com/s/25gcpllsqsj1qrq/update.xml?token_hash=AAFnI4T9nSCGeVgDKLm7YB79dbjNtoYkAj_mChxVDZL0AQ&dl=1";
WebRequest request = HttpWebRequest.Create(url);

using (WebResponse response = request.GetResponse())
using (Stream stream = response.GetResponseStream())
{
    var doc = XDocument.Load(stream);

    // do your magic (now it's a valid XDocument)
}
于 2013-05-26T11:59:23.940 回答