从 Windows Phone 中的 XML 读取随机条目

本文关键字:随机 读取 XML Windows Phone 中的 | 更新日期: 2023-09-27 17:55:13

我正在为 Windows Phone 编写我的第一个应用程序,但我遇到了一个问题。我创建了一个按钮,该按钮应该从文本块上的XML生成一个随机条目。XML 本身如下所示:

  <Activities>
    <Activity Type="Cooking">
      Cook some Mexican food
    </Activity>
    <Activity Type="Art">
      Draw a picture
    </Activity>
    <Activity Type="Language">
      Learn 5 words in Polish you didn't know yet
    </Activity>
    <Activity Type="Science">
      Write a simple program in C
    </Activity>
    <Activity Type="Sport">
      Go to the swimming pool
    </Activity>
  </Activities>

但是有一个问题。当我按下按钮时,它有时会生成随机条目,但有时它只是打印条目的"类型",有时同时打印条目和类型。如何防止这种情况发生?我仍然想加载条目的类型以供将来使用,但我不希望它显示在文本块中。这是我的代码:

类加载 XML 文件:

namespace ReadXMLfromFile
{
    public class Activities
    {
        private List<String> activities;
        public String getActivities(int i)
        {
            return activities.ElementAt(i);
        }
        public List<String> getActivities()
        {
            return activities;
        }
        public Activities()
        {
            IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication();
            activities = new List<String>();
            if (ISF.FileExists("Activities.xml"))
            {
                IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("Activities.xml", FileMode.Open, FileAccess.Read, FileShare.Read, ISF);
                var aclist = from c in XElement.Load(isoStream).Element("Activities").Elements()
                             select c;
                ISF.Dispose();
                isoStream.Dispose();
                foreach (var el in aclist)
                {
                    this.activities.Add(el.Value);
                    if ((string)el.Attribute("Type") == "Cooking")
                        this.activities.Add("Cooking");
                    else
                    if ((string)el.Attribute("Type") == "Art")
                         this.activities.Add("Art");
                    else
                    if ((string)el.Attribute("Type") == "Language")
                        this.activities.Add("Language");
                    else
                    if ((string)el.Attribute("Type") == "Science")
                        this.activities.Add("Science");
                    else
                    if ((string)el.Attribute("Type") == "Sport")
                        this.activities.Add("Sport");
                } 
             }
            else
            {
                ISF.Dispose();
                var aclist = from c in XElement.Load("Assets/Activities.xml").Element("Activities").Elements()
                             select c;
                foreach (var el in aclist)
                {
                    this.activities.Add(el.Value);
                    if ((string)el.Attribute("Type") == "Cooking")
                        this.activities.Add("Cooking");
                    else
                        if ((string)el.Attribute("Type") == "Art")
                            this.activities.Add("Art");
                        else
                            if ((string)el.Attribute("Type") == "Language")
                                this.activities.Add("Language");
                            else
                                if ((string)el.Attribute("Type") == "Science")
                                    this.activities.Add("Science");
                                else
                                    if ((string)el.Attribute("Type") == "Sport")
                                        this.activities.Add("Sport");
                } 
            }
        }
    }
}

这是我的主页类:

namespace ActivityManager
{
    public partial class MainPage : PhoneApplicationPage
    {
        private Activities ac;
        private Random activityNumber;
        private int actualActivityNumber;

        // Constructor
        public MainPage()
        {
            InitializeComponent();
            ac = new Activities();
        }

        private void RandomButton_Click(object sender, RoutedEventArgs e)
        {
            RandomTextBox.Text="0";
           activityNumber = new Random();
            actualActivityNumber = activityNumber.Next(0, ac.getActivities().Count);
            RandomTextBox.Text = ac.getActivities(actualActivityNumber);
        }
    }
}

提前谢谢你。

从 Windows Phone 中的 XML 读取随机条目

我会以非常不同的方式构建代码:

  • 为类型和说明创建一个类
  • 不要使用所有这些if语句 - 你在每种情况下都在做基本上相同的事情。如果要跳过其他类型,则始终可以对已知类型使用HashSet<string>
  • 不要有两个不同的代码位,它们都读取相同的XML结构
  • 使用 using 语句进行IsolatedStorageFile

所以像这样:

public class Activity
{
    public string Type { get; private set; }
    public string Description { get; private set; }
    public Activity(string type, string description)
    {
         Type = type;
         Description = description;
    }
    public static List<Activity> LoadActivities(XDocument doc)
    {
        return doc.Root
                  .Elements("Activity")
                  .Select(el => new Activity((string) el.Attribute("Type"),
                                             el.Value));
                  .ToList();
    }
    public static List<Activity> LoadActivities()
    {
        using (var store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (store.FileExists("Activities.xml"))
            {
                 using (var stream = store.OpenFile("Activities.xml",
                                                    FileMode.Open))
                 {
                     return LoadActivities(XDocument.Load(stream));
                 }
            }
        }
        // No user file... load the default activities
        return LoadActivities(XDocument.Load("Assets/Activities.xml"));
    }
}
...
namespace ActivityManager
{
    public partial class MainPage : PhoneApplicationPage
    {
        private List<Activity> activities;
        private Random random;
        private int actualActivityNumber;

        // Constructor
        public MainPage()
        {
            InitializeComponent();
            activities = Activity.LoadActivities();
            // Initialize this *once* - not once per click
            random = new Random();
        }

        private void RandomButton_Click(object sender, RoutedEventArgs e)
        {
            int index = random.Next(activities.Count);
            RandomTextBox.Text = activities[index].Description;
        }
    }
}