我正在尝试阅读xml文件,我想这样做:
ComboBox
,会显示xml中的所有蔬菜名称。ComboBox
将在xml中显示食谱名称,该名称可以使用在第一个ComboBox
中选择的蔬菜进行烹饪。<Vegetables>
<vegetable name="Carrot">
<recipe name="ABCrecipe">
<FilePath>C:\\</FilePath>
</recipe>
<recipe name="DEFrecipe">
<FilePath>D:\\</FilePath>
</recipe>
</vegetable>
<vegetable name="Potato">
<recipe name="CBArecipe">
<FilePath>E:\\</FilePath>
</recipe>
<recipe name"FEDrecipe">
<FilePath>F:\\</FilePath>
</recipe>
</vegetable>
</Vegetables>
public Form1()
{
InitializeComponent();
xDoc.Load("Recipe_List.xml");
}
XmlDocument xDoc = new XmlDocument();
private void Form1_Load(object sender, EventArgs e)
{
XmlNodeList vegetables = xDoc.GetElementsByTagName("Vegetable");
for (int i = 0; i < vegetables.Count; i++)
{
comboBox1.Items.Add(vegetables[i].Attributes["name"].InnerText);
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//I'm lost at this place.
}
第一个ComboBox
现在能够显示蔬菜名称,但如何根据xml文件让第二个ComboBox
读取食谱?
答案 0 :(得分:2)
您可以构建以下Xpath,然后获取蔬菜的配方
string xpath = string.Format("//vegetable[@name='{0}']/recipe",comboboxSelectedItem);
var selectedVegetableRecipe = xdoc.SelectSingleNode(xpath);
然而,正如Ondrej Tucny指出的那样,在应用程序启动期间,您可以将xml文档缓存在静态XMLDocument中,然后使用代码来避免每次调用的性能开销。
答案 1 :(得分:0)
首先,您不会将解析后的XML存储在任何位置。因此,在comboBox1_SelectedIndexChanged
中,您无法使用它。您应该在表单中引入私有字段(或属性,无论如何),而不是xDoc
局部变量。
如果您出于某些奇怪的原因想要继续使用XML文件,那么您必须在<vegetable>
中查找选定的comboBox1_SelectedIndexChanged
元素,然后处理其所有子文件<recipe>
元素。然而,这不必要地复杂化。更好的方法是从声明数据结构开始并使用XML serialization。
您最终会得到两个类Vegetable
和Recipe
,并使用XmlSerializer
来序列化(存储到XML中)和反序列化< / em>(从XML读取)您的数据。在表单中,您将使用对象,而不必手动使用XML。