从 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);
}
}
}
提前谢谢你。
我会以非常不同的方式构建代码:
- 为类型和说明创建一个类
- 不要使用所有这些
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;
}
}
}