如何读取节点内子节点的属性?

时间:2013-05-26 10:43:25

标签: c# xml winforms

我正在尝试阅读文件,我想这样做:

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

    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读取食谱?

2 个答案:

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

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