1

我正在尝试读取一个文件,我想这样做:

  1. AComboBox将显示中的所有蔬菜名称。
  2. 选择蔬菜后,第二个将在中显示可以使用第一个选择的蔬菜进行烹饪ComboBox的食谱名称。ComboBox
  3. 最后,使用 OK 按钮,所选配方将读取指向该配方的文件路径。

我写的 XML

<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>

C# 代码

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现在可以显示蔬菜名称,但是如何让第二个ComboBox根据文件读取食谱?

4

2 回答 2

2

您可以构建以下 Xpath,然后获取蔬菜的配方

string xpath = string.Format("//vegetable[@name='{0}']/recipe",comboboxSelectedItem);
var selectedVegetableRecipe = xdoc.SelectSingleNode(xpath);

但是,正如 Ondrej Tucny 指出的那样,在应用程序启动期间,您可以将 xml 文档缓存在静态 XMLDocument 中,然后在代码中使用它来避免每次调用的性能开销。

于 2013-05-26T10:58:24.240 回答
0

首先,您没有将解析的 XML 存储在任何地方。因此,comboBox1_SelectedIndexChanged您无法使用它。您应该在表单中引入私有字段(或属性,等等)而不是xDoc局部变量。

如果您出于某种奇怪的原因想要继续按照您现在使用 XML 文件的方式进行操作,则必须在其中查找所选<vegetable>元素comboBox1_SelectedIndexChanged,然后处理其所有子<recipe>元素。然而,这是不必要的复杂。更好的方法是从声明数据结构开始并使用XML 序列化

您最终将得到两个类,VegetableRecipe,并用于XmlSerializer序列(存储到 XML)和反序列化(从 XML 读取)您的数据。然后,您将在表单中使用对象,而不必手动使用 XML。

于 2013-05-26T10:53:13.477 回答